queue と resultscontroller の組み合わせを使用して、一部のコアデータ オブジェクトを更新および表示します。
私のuitableviewcontrollerでは、X秒ごとにメインコントローラーオブジェクトのメソッドを呼び出します。
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test:) userInfo:nil repeats:YES];
}
- (void)test:(NSTimer*)theTimer {
[[MainController instance] updatePersons];
}
このメソッドでは、カスタム NSOperation オブジェクトがメイン Q に追加されます。
- (BOOL)updatePersons {
UpdatePersonsOperation* u = [[UpdatePersonsOperation alloc] init];
[u setQueuePriority:NSOperationQueuePriorityVeryHigh];
[operationQ u];
[u release];
操作自体は、新しい managedobjectcontext を作成し、web からいくつかの xml をダウンロードしようとし、coredata データベースを更新しようとします... (このコードは機能します!)
私のメインコントローラーでは、コンテキストが変更されたメッセージを受け取り、mergeChangesFromContextDidSaveNotification を使用してメインオブジェクトのコンテキストをマージおよび更新します。すべての resultscontroller は、このメイン オブジェクト コンテキストを使用します。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationManagedObjectContextDidSave:) name:
NSManagedObjectContextDidSaveNotification object:nil];
実際にはすべて機能しますが、NSOperation 内に新しいオブジェクトを挿入すると、UI が更新されてこの新しいオブジェクトが表示されるまでに 4 ~ 6 秒かかります...さらに、UI がブロックされます...スクロールしたり、他の相互作用をトリガーしたりすることはできません.. .
キューを使用せず、オブジェクトをダウンロードして更新するコードを uitableviewcontroller クラス内のメソッドに配置し、これを使用する場合
[NSThread detachNewThreadSelector:@selector(codeFromUpdatePersonsOperation) toTarget:self withObject:nil];
すべてが非常にうまく機能し、遅延や UI のフリーズはありません...
誰かが私にこの振る舞いを説明できますか?
ありがとう