异步回调的时机

异步回调的时机

问题描述:

我想从intenet下载请求中了解完成块的时间。在这种情况下firebase。下面的代码示例没有做任何事情,但它说明了我的问题。异步回调的时机

说我有在keysArray 100个值,将有100异步请求火力点和结束块将被执行100次

func someFunction() { 
    for keys in keysArray { 
     loadDataFromFirebaseWithKey(completionHandler: { (success, data) in 

      print(data) 

      // Task A Some length for loop 
      for i in 0...10000 { 
       print("A") 
      } 

      // Task B 
      for i in 10001...20000 { 
       print("B") 
      } 
     }) 

     // Task C 
     for i in 20001...30000 { 
      print("C") 
     } 

     // Task D 
     for i in 30001...40000 { 
      print("D") 
     } 
    } 
    // Task E 
    for i in 40001...50000 { 
     print("E") 
    } 

    // Task F 
    for i in 50001...60000 { 
     print("F") 
    } 
} 

我使用这么大的for循环是说明一些原因耗时/不同步的过程。这里有三种情况,我想知道

  1. 说,如果程序是通过任务C的一半,它才去完成块做A和B

  2. 说完成C和也d如果程序通过任务E是半路上,它才去完成块做A和B完成E和还˚F

+0

你有这些结果是正确的,我的意思是你打印的一切。所以,理想情况下你应该看到结果。 –

+0

而不是发布这个问题,为什么不实际做测试?你会得到什么结果?根据结果​​,如果您不了解这些结果,请更新您的问题,询问结果为何出现的结果与预期不同。 – rmaddy

+0

我很欣赏“你尝试过吗?”背后的理由吗?建议,但会提醒我们,当我们谈论并发时,经验证据应该是决定性的。合同保证很重要,而不是你是否在开发过程中遇到了千分之一的竞争条件。 – Tommy

如果任务同时运行,它们可以相互替换为活动的事在一个机会,并可能只是继续真正concurrenc考虑到4s以来的所有iOS设备都有多个内核。没有任何理由,任何特定的for循环将在中断时的任何特定点处。

如果Firebase在串行队列上安排其完成处理程序,则没有任何处理程序会与其他任何处理程序重叠。

如果Firebase在主队列上安排其完成处理程序,并且您正在从主队列中调用它,那么它的完成处理程序和您的调用代码都不会相互重叠。

所以,直接回答:

  1. 是,如果火力地堡是在同一个队列调度完成处理,你从调用和队列串行 - 这几乎总是意味着“是”,如果一切是主队列链接。否则不。

  2. 同样的答案。 for循环没有特殊的并发性。它们与其他任何代码完全相同。

+0

谢谢汤米。你和Rob在并发方面的很好的解释 – user125972