0

ここで奇妙な問題があります。NSManagedObjectで「更新」操作のコールバックを取得していませんが、そのエンティティタイプのコレクションに挿入または削除されたオブジェクトは、デリゲートコールバックをトリガーします。

質問をさらに進める前に、セットアップについてお知らせします。

  • NSFetchedResultsControllerが適切に構成されている。外部で変更されているプロパティが、このAppleドキュメントで要求されているfetchedResultsControllerのソートキーではないことを確認してください。

    オブジェクトの状態が変更されると更新が報告されますが、変更された属性はソートキーの一部ではありません。

  • これらの変更が行われている管理対象オブジェクトのコンテキストは1つだけです。

  • 挿入と削除の操作がデリゲートに報告されているので、更新操作について何か怪しいことがあると思います

RKLogsを使用してRestkitコードをドリルダウンし、マッピングが正確に行われる場所と、coredataオブジェクトが更新されている場所を確認して、更新デリゲートコールバックを取得しない理由を調べました。

class RKManagedObjectMappingOperation-performMappingメソッドで、Blake Watters氏は、更新時にMOCコールバックがトリガーされない理由を文書化しました。

- (BOOL)performMapping:(NSError **)error
{
    BOOL success = [super performMapping:error];
    if ([self.objectMapping isKindOfClass:[RKManagedObjectMapping class]]) {
        /**
         NOTE: Processing the pending changes here ensures that the managed object context generates observable
         callbacks that are important for maintaining any sort of cache that is consistent within a single
         object mapping operation. As the MOC is only saved when the aggregate operation is processed, we must
         manually invoke processPendingChanges to prevent recreating objects with the same primary key.
         See https://github.com/RestKit/RestKit/issues/661
         */
        [self connectRelationships];
    }
    return success;
}

しかし、私は自分の人生のためにこれを修正する方法を理解することはできませんか?Cozそれは意図的に行われたのですか?

誰かが同じ問題に直面しましたか?どうすれば修正できますか?

ありがとう、Raj Pawan

4

1 に答える 1

0

私の側から1つの間違いがあり、私が気づかなかったためにこの問題に直面した他の1つのこと(無知)がありました:

間違い:
フォーラム全体で多くの議論があったにもかかわらず、私は2番目にリストされた項目を述べるのは間違っていました:

  • これらの
    変更が行われている管理対象オブジェクトのコンテキストは1つだけです。

私は間違ってログに記録し、私が同じコンテキストにいることを知りました!とてもばかげている!

無知:
何か怪しいことが起こっていると思ってRKコードを掘り下げ、Blake Wattersのコメントと彼のコミット4b394f8c1e1fをチェックして、現在削除されている以前のコード(-processPendingChangesの呼び出し)が問題を引き起こしているかどうかを確認しました。デリゲートに更新について通知させる。

これは確かに別のスレッドにあり、はい、私が見逃していた独自のMOCがあったことがわかりました。次に行うことは簡単でした。異なるスレッドからのMOCの変更をメインMOCにマージするメカニズムを実装しました。しかし、これもうまくいきませんでした!

その理由は、私がアプリケーション開発の非常に初期の段階にあることがわかりました。RestKitを使用してjson応答をcoredataオブジェクトにマッピングしているだけで、どこにも利用していません。私はGDBにcoredataオブジェクトを記録していましたが、それらは常に障害状態のままでした!-objectLoader私はコールバックに頼っていました、そしてNSNotification object実際にアップデートがあったことを確認するために利用可能。テスト中のある時点で、メインMOCにマージされる前に、通知コールバックで変更された管理対象オブジェクトのプロパティをログに記録しました。これにより、管理対象オブジェクトに障害が発生し、管理対象オブジェクトのすべてのプロパティが読み込まれました。これで、セカンダリスレッドのMOCの変更が​​メインスレッドのMOCとマージされたときに、NSFetchedResultsControllerDelegateコールバックがトリガーを開始しました。

于 2012-11-20T14:44:33.883 に答える