2

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 のフリーズはありません...

誰かが私にこの振る舞いを説明できますか?

ありがとう

4

1 に答える 1

0

もう 1 つの問題は、UI の更新をメイン スレッドで行う必要があることです。私はあなたが報告したのと同じ問題を経験していました.

[target performSelectorOnMainThread:@selector(methodToUpdateUI:) withObject:dataFromRetrievalOperation waitUntilDone:NO];

これにより、スレッドの処理が完了するとすぐに UI が更新されます。それ以外の場合、UI アニメーションが発生するまで約 5 秒待機します。

于 2012-05-26T15:46:51.777 に答える