2

http://goo.gl/MkV8Vから

が使用されるスレッドでマネージド コンテキストを作成する必要があります。NSOperation を使用する場合は、その init メソッドが呼び出し元と同じスレッドで呼び出されることに注意してください。したがって、キューの init メソッドでキューの管理対象オブジェクト コンテキストを作成しないでください。そうしないと、呼び出し元のスレッドに関連付けられます。代わりに、main (シリアル キューの場合) または start (同時キューの場合) でコンテキストを作成する必要があります。

http://goo.gl/6CMO4より

ConnectionDidLoading メソッド内:

ParseOperation *parseOperation = [[ParseOperation alloc] initWithData:self.earthquakeData];
[self.parseQueue addOperation:parseOperation];
[parseOperation release];   // once added to the NSOperationQueue it's retained, we don't need it anymore

メインスレッドで ConnectionDidiLoading が呼び出されています。ParseOperation::initWIthData メソッド内には、次のようなものがあります: (ParseOperation.m ファイルを参照)

    // setup our Core Data scratch pad and persistent store
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [self.managedObjectContext setUndoManager:nil];

    SeismicXMLAppDelegate *appDelegate = (SeismicXMLAppDelegate *)[[UIApplication sharedApplication] delegate];
    [self.managedObjectContext setPersistentStoreCoordinator:appDelegate.persistentStoreCoordinator];

#

私の理解では、この managedObjectContext はまだメインスレッドで作成されています。

Apple のサンプル コードが正しくない可能性は非常に低いため、誰かが私の理解を明確にするか修正していただければ幸いです。

4

2 に答える 2

0

ここで良い点。コードが正しくないようです (ただし、間違っている可能性があります)。私の経験に基づいて、(たとえば) start メソッド内でコンテキストを作成する必要があります。そうしないと、奇妙なことが起こる可能性があります。

NSManagedObjectもう 1 つのルールは、踏面の間を通過できないことです。代わりに渡しNSManagedObjectIDます。それらを渡す前に、ディスクに保存する必要があります。

これらのルールは iOS 5 で適用されます。iOS 5 以降では、Core Data の新しい API を利用して、プライベート キュー (メイン キューもあります) でコンテキストを作成し、そこで長時間実行される計算を実行できます。NSManagedObjectまた、スレッド間でパスすると例外が発生します。

于 2012-06-17T22:30:10.163 に答える
0

私の意見では、あなたは正しいです。Apple は、このサンプル コードで独自のルールを破っているようです。ただし、実際にはあまり宣伝されていないようですが、マネージド オブジェクト コンテキストが 1 つのスレッドでのみ使用されている限り、コンテキストが作成されたスレッドに関係なく安全です。

于 2012-06-19T07:10:29.683 に答える