2

我使用队列和结果控制器的组合来更新和显示一些核心数据对象。

在我的 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 合并和更新我的主对象上下文。所有结果控制器都使用这个主对象上下文。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationManagedObjectContextDidSave:) name:
                                        NSManagedObjectContextDidSaveNotification object:nil];

实际上一切正常,但是当我在 NSOperation 中插入一个新对象时,需要 4-6 秒直到 UI 更新并显示这个新对象......此外,UI 块......它不可能滚动或触发其他交互.. .

当我不使用队列并将我的代码下载并更新到我的 uitableviewcontroller 类中的方法中时,我使用它

[NSThread detachNewThreadSelector:@selector(codeFromUpdatePersonsOperation) toTarget:self withObject:nil];

一切运行良好,没有任何延迟或 UI 冻结...

有人可以向我解释这种行为吗?

谢谢

4

1 回答 1

0

另一个问题可能是更新 UI 需要在主线程上进行。我遇到了您报告的相同问题,最终发现如果您致电

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

这将导致 UI 在线程完成处理后立即更新。否则,它会在 UI 动画发生之前等待大约 5 秒。

于 2012-05-26T15:46:51.777 回答