0

私がやろうとしていることは次のとおりです。

Product *product = [fetchResult lastObject];

NSString *productID = product.atProductID;

dispatch_async(queue, ^(void){
// Something with productID like
NSLog(@"productID is %@", productID);
});

このようにしても安全ですか、それともセカンダリ キュー用に別のコンテキストを作成し、内部 ID で製品を取得してから、その atProductID 属性を処理する必要がありますか?

更新: まあ、実際には安全ではないことが明らかになりました。簡単な解決策の 1 つは、productID 文字列のコピーを作成することです。

Product *product = [fetchResult lastObject];

NSString *productID = [product.atProductID copy];

dispatch_async(queue, ^(void){
// Something with productID like
NSLog(@"productID is %@", productID);
});

バックグラウンドスレッドでコンテキストまたはその派生物への参照を保持しないため、これは安全です。これは、コンテキストが永続ストアからフェッチしたデータをキャッシュし、それ自体がそのキャッシュを管理するためです。また、そのキャッシュへのポインターを保持するかどうかに関係なく、コンテキストのスレッドで使用されない限り、変更または破棄される可能性があります。

4

2 に答える 2

0

あなたのコードは問題ないようです。長いフェッチや管理対象オブジェクトの変更など、何かを行う場合にのみ、別の管理対象オブジェクト コンテキストが必要です。

また、asyncブロックのスコープ内で問題なく変数を使用できます。それがCGDの大きな利点です。これらのスレッドにはメモリが含まれているため、文字列がコピーされると予想されます。ポインターアドレスをログに記録することで確認できます。

于 2012-12-20T11:48:25.973 に答える
-1

これまでdispatch_asyncを使用したことはありませんが、このコードは私にはまったく健康に見えません

あるスレッドで作成された変数を使用し、それを別のコード ブロックに直接渡しています。これを行う適切な方法は、オブジェクト/パラメーターをメソッドに渡すことです。

注意すべきことの 1 つは、あなたの質問は 100% 正確ではないということです。実行すると

NSString *productID = product.atProductID;

NSManagedObject (つまり、製品) に関連付けられていない、まったく新しい NSString オブジェクトを作成しています。したがって、あなたの質問はむしろdispatch_asyncのパラメーターを渡すことであり、NSManagedObjectsとはあまり関係がありません

于 2012-12-20T11:30:46.103 に答える