0

特定の属性を持つ NSManagedObject (サブクラス) を作成しています。同時に、NSManagedObject の属性を指定してネットワーク操作を行うコード/ブロックを実行しています。現在、ネットワーク操作が失敗したり、時間がかかりすぎたりする場合があるため、そのコード/ブロックの実行をキャンセルする機能を追加したいと考えています。

コード/ブロックを NSThread にすることを考えていましたが、[theThread cancel] を呼び出すことができます。ただし、NSManagedObject カテゴリにプロパティを追加できない場合、NSThread を NSManagedObject に関連付けるにはどうすればよいでしょうか? プロパティを NSManagedObject 自体の定義に追加しても問題ありませんか? 正当に思えますが、Core Data モデルへのその後の変更により、私のコードが上書きされると思います。

しかし、私がやろうとしていることを達成するための、まったく異なる、より良い方法があるのではないでしょうか? 何か案は?

4

1 に答える 1

2

まず、新しいコードは NSThread よりも GCD または NSOperationQueue を優先する必要があります。使用しNSThreadていることに気付いた場合は、速度を落として、設計と実装の要件を再検討してください。

第二に、スレッド間で NSManagedObject を使用することは、本当に悪いことです。非常に些細なこと以外を行うと、正しく行うことも非常に難しくなる可能性があります。

最後に、スレッド化されたネットワーク アクセスをどのように行うかに関係なく、管理対象オブジェクトからデータを取得し、管理対象オブジェクト自体の代わりにそれを渡すことを優先する必要があります。

管理対象オブジェクトにアクセスする必要がある場合は、管理対象オブジェクトのコンテキストが、NSMainQueueConcurrencyTypeまたは管理対象オブジェクトのプロパティをNSPrivateQueueConcurrencyType呼び出すperformBlockperformBlockAndWait使用するなどして管理対象オブジェクトにアクセスすることを確認してください。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

于 2012-09-12T18:39:02.593 に答える