Dispatch.main.async内部的调度队列

时间:2018-07-29 16:50:38

标签: ios swift xcode grand-central-dispatch

我当前正在从事一个项目,该项目需要我更新数据库,然后遍历数据库以比较一些值。由于数据库更新时间长,我决定使用延迟调用,以便给它更新时间。这是我的通话结构:

//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);  <---------
    });
}

1 个答案:

答案 0 :(得分:0)

调度是异步的,但是您正在主线程上运行它。

您只需在后台线程上运行它,就不会破坏UI。

DispatchQueue.global(qos: .background).async {

}