在其他一些方法中,有两种方法可以在GCD获得队列: dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_get_main_queue(); 如果我没有完全错误,主要的线程正在执行“主队列”,并且对于执行UI工作的“callback”块是有用的。 这是否意味着“全局队列”是在后台线程上运行的?
我正在努力完全理解GCD中的并发和串行队列。 我有一些问题,希望有人能够清楚地回答我的问题。 我正在读取串行队列被创build和使用,以便一个接一个地执行任务。 但是,如果发生以下情况: 我创build一个串行队列 我使用dispatch_async (在我刚创build的串行队列上)三次分派三个块A,B,C 这三个块是否会被执行: 按顺序A,B,C,因为队列是串行的 要么 同时(在parralel线程同时),因为我使用ASYNC调度 我读到我可以在并发队列上使用dispatch_sync来一个接一个地执行块。 在这种情况下,为什么串行队列甚至存在,因为我总是可以使用一个并发队列,在那里我可以同步调度尽可能多的块? 感谢您的任何好解释!
我一直在使用成功,在我的应用程序的大中央调度,但我想知道什么是使用这样的事情的真正优势: dispatch_async(dispatch_get_main_queue(), ^{ … do stuff 甚至 dispatch_sync(dispatch_get_main_queue(), ^{ … do stuff 我的意思是,在这两种情况下,你都是在主线程上发射一个块,在应用程序运行的地方,这对减轻负载无济于事。 在第一种情况下,当模块运行时,您无法进行任何控制。 我已经看到了在你开火半秒之后被执行的情况。 第二种情况,它类似于 [self doStuff]; 对? 我想知道你们是怎么想的。
我想要一个for循环发送一堆networking请求到firebase,然后传递数据到一个新的视图控制器,一旦方法完成执行。 这是我的代码: var datesArray = [String: AnyObject]() for key in locationsArray { let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)") ref.observeSingleEventOfType(.Value, withBlock: { snapshot in datesArray["\(key.0)"] = snapshot.value }) } //Segue to new view controller here, and pass datesArray once it is complete 我有几个担心。 首先,如何等待for循环完成并且所有networking请求都完成? 我无法修改observeSingleEventOfType函数,它是firebase SDK的一部分。 另外,我会通过尝试访问来自for循环的不同迭代的datesArray来创build某种竞争条件(希望是有道理的)? 我一直在阅读关于GCD和NSOperation,但我有点失落,因为这是我build立的第一个应用程序。 注意:Locations数组是包含我需要在Firebase中访问的键的数组。 此外,networking请求asynchronous触发也很重要。 我只想等到所有的asynchronous请求完成,然后再将datesArray传递给下一个视图控制器。
我已经通过了苹果的iBook ,并找不到它的任何定义: 有人可以解释dispatch_after的结构吗? dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)