まず、新しいコードは NSThread よりも GCD または NSOperationQueue を優先する必要があります。使用しNSThread
ていることに気付いた場合は、速度を落として、設計と実装の要件を再検討してください。
第二に、スレッド間で NSManagedObject を使用することは、本当に悪いことです。非常に些細なこと以外を行うと、正しく行うことも非常に難しくなる可能性があります。
最後に、スレッド化されたネットワーク アクセスをどのように行うかに関係なく、管理対象オブジェクトからデータを取得し、管理対象オブジェクト自体の代わりにそれを渡すことを優先する必要があります。
管理対象オブジェクトにアクセスする必要がある場合は、管理対象オブジェクトのコンテキストが、NSMainQueueConcurrencyType
または管理対象オブジェクトのプロパティをNSPrivateQueueConcurrencyType
呼び出すperformBlock
かperformBlockAndWait
使用するなどして管理対象オブジェクトにアクセスすることを確認してください。managedObjectContext
編集
わかりました、これを確認させてください。私が現在行っていることは、backgroundContext を生成し、performBlock を使用して新しい NSManagedObject を作成し、そのバックグラウンド コンテキストを保存し、(performblock を使用して) 親コンテキストに切り替え、existingObjectWithId: を使用してそのコンテキストで新しく作成されたオブジェクトを取得することです。次に、NSOperation サブクラスを作成し、NSManagedObject (親コンテキストから) をその NSOperation サブクラス (サブクラスのプロパティ) に関連付け、その操作を NSOperationQueue に配置します。その NSOperation 内で、NSManagedObject が変更されます。うまくいっているようですが、大丈夫でしょうか?– user1013725
あの…もしかして???私はそれに従いませんでした。コードを投稿していただけますか?その方が正確で分かりやすいでしょう。
@JodyHagins私はperformBlockを使用していませんが、managedObjectContextがメインコンテキストであるため、それで問題ないでしょうか? – user1013725
いいえ。
メイン コンテキストがalloc] init]
またはで作成されてalloc] initWithConcurrencyType:NSConfinementConcurrencyType
いる場合は、メイン スレッドで実行されていることがわかっている場合にのみ使用する必要があります。
で作成された場合は、メイン スレッドまたはいずれかのメソッド内でalloc] initWithConcurrencyType:NSMainThreadConcurrencyType
実行していることがわかっている場合にのみ使用する必要があります。performBlock