我目前正在处理一个项目,该项目要求我更新数据库,然后在数据库上循环以比较一些值。由于数据库更新时间的原因,我决定使用延迟调用,以便给它更新时间。以下是我的通话结构:
//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); <---------
});
}
Dispatch是异步的,但您在主线程上运行它。
你可以简单地在后台线程上运行它,它不会破坏UI。
DispatchQueue.global(qos: .background).async {
}