1

我有一个应用程序,它在每次启动时使用 Rails 后端与服务器同步数据。API 完全可以工作,但是当需要刷新界面时,我遇到了界面变得无响应的问题。

我目前正在使用 GCD 开始同步:

Sync *sync = [[Sync alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [sync force_sync:@""];
    [appModel updateSyncTime:current_time];
});

同步完成后,我让 Sync 对象向应用程序发送 NSNotification 以便界面刷新:

dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Sync-Completed" object:self];
});

收到通知后,我的其他类只是简单地重新加载 UITableView 中的数据,如下所示:

 - (void)notificationReceived:(NSNotification *)notification {
    [dataTable reloadData];
 }

直到收到通知为止,UI 都是完全响应的。收到通知后,在刷新完成之前,您无法在其他 UI 元素之间滚动 UITableView。我敢肯定有更好的方法来做到这一点,但如何?

提前致谢!

4

1 回答 1

1
dispatch_async(dispatch_get_main_queue(), ^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Sync-Completed" object:self];
});

不是异步的——你只是在你的主队列上倾倒了大量的刷新工作(同步完成通知的处理)——所以你的应用程序将被锁定,除非你处理更新 UI 的代码。

此外,使用全局队列进行繁重的 IO 操作也不一定是个好主意。我已经看到这样做会锁定 UI 的情况 - 所以请确保它是通知而不是同步本身。

如果您发现它是同步本身 - 创建您自己的 NSOperation 队列并从该块中创建一个 NSOperation 。

您的里程可能会有所不同,但总的来说,使用全局队列对我来说不适用于异步 IO。

于 2012-09-17T14:53:55.283 回答