如何在同步后正确处理 UI 刷新



我有一个应用程序,可以在每次启动时使用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 对象向应用程序发送 NSNotization,以便界面刷新:

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

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

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

在收到通知之前,UI 是完全响应的。收到通知后,在刷新完成之前,无法在其他 UI 元素之间滚动 UITableViews。我相信有更好的方法可以做到这一点,但是如何呢?

提前感谢!

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

不是异步的 - 您刚刚在主队列上转储了大量刷新工作(处理同步完成的通知) - 因此除非您处理更新 UI 的代码,否则您的应用程序将锁定。

此外,将全局队列用于繁重的 IO 操作不一定是一个好主意。 我见过这样做会锁定 UI 的情况 - 因此请确保它是通知而不是同步本身。

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

您的里程可能会有所不同,但一般来说,使用全局队列对我来说对异步 IO 不起作用。

最新更新