1

Core Data+concurrency/nested MOC の処理に問題があります (=P でどれに問題があるかわかりません)。

管理オブジェクト ID を渡すメソッドがあり (永続的であることを確認しました)、そのメソッドには、特定のキューに限定された子管理オブジェクト コンテキストがあります。を介して子マネージド オブジェクト コンテキストからオブジェクトを取得できますが[managedObjectContext objectWithID:moID]、そのプロパティのいずれかにアクセスしようとすると (マネージド オブジェクトはまだエラーです)、EXC_BAD_ACCESSスタック トレースに と が表示_svfk_1されobjc_msgSendます。

サンプル コードがないと問題の原因を特定するのは難しいことは承知していますが、考えられる原因について誰かが明らかにしてくれることを期待していました。ありがとう。=)

編集:existingObjectWithID:error: Tom Harringtonが提案した代わりに使用してみましobjectWithID:たが、時々機能しますが、他の時間は機能しません。EXC_BAD_ACCESSでのクラッシュも経験しましたmergeChangesFromContextDidSaveNotification:。これは同期の問題であると思われます。あるコンテキストで何かを編集し、子コンテキストで他の何かを編集している間に保存すると、問題が発生しますか?

編集 2: existingObjectWithID:error: が常にではなく時々機能する理由がわかりました。管理オブジェクト ID は確かに一時的な ID でした (永続的な ID に変換すべきではありませんか?) ため、ID を渡す前mergeChangesFromContextDidSaveNotification:に呼び出す必要がありました。obtainPermanentIDsForObjects:error:しかし、私はまだ子コンテキストの でクラッシュすることがありますmergeChangesFromContextDidSaveNotification:。これの考えられる原因は何ですか?ありがとう。

編集 3:私の MOC 階層は次のようになります。

   Persistent Store Coordinator
                |
      Persistent Store MOC
         /            \
Main Queue MOC   Child MOC (confinement)

Child MOC (別のキュー内) を使用していくつかのマネージド オブジェクトを挿入および更新するメイン キューからメソッドを呼び出しています。同時に、Persistent Store MOC 内のマネージド オブジェクトを挿入および更新しています。管理対象オブジェクトは、メイン キュー MOC で同時に更新、削除、および挿入することもできます。Persistent Store Coordinator からのすべての変更を Main Queue MOC と Child MOC の両方にマージします。

いくつかの質問: MOC を保存すると自動的にマージされますか? MOC の保留中のマージ リクエストがあり、そのマージ リクエストが処理される前に保存すると、問題が発生する可能性がありますか?

編集 4:子 MOC を初期化する方法は次のとおりです。

dispatch_sync(_searchQueue, ^{
    _searchManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType];

    [_searchManagedObjectContext setParentContext:_persistentStoreManagedObjectContext];
    [_searchManagedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy];
});

EXC_BAD_ACCESSところで、通知に削除されたオブジェクトが含まれている場合にのみマージがクラッシュすることに気付きました。

4

2 に答える 2

1

あなたはまだ一生懸命働いているようです。子MOCの場合、シリアルキューにあるためNSPrivateQueueConcurrencyType、を使用して、その親をメインMOCに設定します。

NSConfinementConcurrencyTypeレガシー構成用です。

于 2013-03-24T04:15:39.677 に答える