我有一个应用程序,可以在每次启动时使用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 不起作用。