我当前正在从事一个项目,该项目需要我更新数据库,然后遍历数据库以比较一些值。由于数据库更新时间长,我决定使用延迟调用,以便给它更新时间。这是我的通话结构:
//Give database time to update
DispatchQueue.main.asyncAfter(deadline: .now() +5) {
let dispatchGroup = DispatchGroup()
dispatchGroup.enter()
closure {
...data processing....
dispatchGroup.leave()
}
//wait for data-processing inside closure to complete
dispatchGroup.wait()
}
这将冻结我的应用程序。据我了解,闭包应该异步运行,因此我希望在dispatchGroup.wait()时可以达到输入/离开平衡。谢谢您对解决此问题的任何帮助!
请注意,在以下功能中,我偶尔会在所指示的行上出现EXC_BREAKPOINT错误:
- (void) fireEvent:(id <FEvent>)event queue:(dispatch_queue_t)queue {
if ([event isCancelEvent]) {
FCancelEvent *cancelEvent = event;
FFLog(@"I-RDB065001", @"Raising cancel value event on %@", event.path);
NSAssert(self.cancelCallback != nil, @"Raising a cancel event on a listener with no cancel callback");
dispatch_async(queue, ^{
self.cancelCallback(cancelEvent.error);
});
} else if (self.callback != nil) {
FDataEvent *dataEvent = event;
FFLog(@"I-RDB065002", @"Raising value event on %@", dataEvent.snapshot.key);
dispatch_async(queue, ^{
self.callback(dataEvent.snapshot); <---------
});
}
答案 0 :(得分:0)
调度是异步的,但是您正在主线程上运行它。
您只需在后台线程上运行它,就不会破坏UI。
DispatchQueue.global(qos: .background).async {
}