私は、別のGCDキュー内のワークブロックを実行し、メインスレッドで完了ブロックを実行するNSManagedObjectContextにメソッド-dct_asynchronousTaskWithWorkBlock:completionBlock:
を追加しました。この方法は、以下のん:2つのブロックにわたる変数の使用
- は、他のキュー
- に使用する2番目の管理対象オブジェクトコンテキストは、この新しいコンテキスト
- とワークブロックを呼び出し作成呼び出し を保存し、自分自身にそのコンテキストをマージ自己完結ブロック
この追加はGitHubに見ることができます。
私の問題は、完了ブロックで参照したいワークブロック内に新しいUser
管理対象オブジェクトを作成することです。私は解決策はそうのようなオブジェクトIDへの参照を作成するだろうと思った:
__block NSManagedObjectID *objectID = nil;
[self.managedObjectContext dct_asynchronousTaskWithWorkBlock:^(NSManagedObjectContext *moc) {
NSManagedObject *user = // create new user.
objectID = [user objectID];
} completionBlock:^(NSManagedObjectContext *moc) {
NSManagedObject *user = [moc objectWithID:objectID];
}];
Iはまた、ブロックをコピーしようとしていると、両方のケースで、私は完了ブロックにおけるオブジェクトIDにEXC_BAD_ACCESSを取得します。
ワークブロック内のユーザのobjectIDを補完ブロックから参照することはできますか?または、カテゴリメソッドで参照を渡すのを処理する方法で作業する必要がありますか。
更新:
ルカ最初に、ユーザは、バックグラウンドスレッドであり、第二に、ユーザが主にあるように、ブロック呼び出しにわたって保持について正しかったです。私は今、これは奇妙に見えるかどうかを疑問に思って
__block NSManagedObjectID *objectID = nil;
[self.managedObjectContext dct_asynchronousTaskWithWorkBlock:^(NSManagedObjectContext *moc) {
NSManagedObject *user = // create new user.
objectID = [user objectID];
[objectID retain];
} completionBlock:^(NSManagedObjectContext *moc) {
NSManagedObject *user = [moc objectWithID:objectID];
[objectID release];
}];
:
これが現時点での私の修正があります。このコードを読んでいるときに、漏れがあるかどうかを尋ねるかもしれません。最初のブロックで何が起こったのかにかかわらず、カテゴリが完全にブロックを呼び出すのは間違いないが、このコードからちょうど分かりやすいかどうかはわかりません。
ワークブロックにobjectIDを保持し、完了ブロックで再び解放するとどうなりますか?ブロック呼び出しの間にobjectIDが解放される可能性があります(元のユーザーオブジェクトが解放されたため)。 –
元気で元のオブジェクトIDを保持し、完了時に解放しました。このコードから、両方のブロックが呼び出されることは明らかではありません。たとえそれがわかっていても、どのように感じるのかはわかりません。 :) –