簡體   English   中英

異步回調的時間

[英]Timing of async callback

我想對來自Internet下載請求的完成塊的時間安排有更好的了解。 在這種情況下,firebase。 以下代碼示例不執行任何操作,但是它說明了我的問題。

假設我在keysArray中有100個值,那么將有100個異步請求發送到firebase,並且完成塊將被執行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之前,它是否完成了C和D?

  2. 假設程序是否在任務E的一半處完成,它在進入完成塊以執行A和B之前是否完成了E和F?

如果任務同時運行,它們可能會相互替代,成為一個活躍的事物,並且鑒於4s以來的所有iOS設備都具有多個內核,它們可能會真正並發進行。 沒有理由在中斷時任何特定的for循環都將在任何特定點。

如果Firebase在串行隊列中安排其完成處理程序,則所有處理程序都不會重疊。

如果Firebase在主隊列上安排其完成處理程序,而您是從主隊列中調用它的,則其完成處理程序和您的調用代碼都不會相互重疊。

所以,直接回答:

  1. 如果Firebase在與您調用的隊列相同的隊列上調度完成處理程序,並且該隊列是串行的,則如果所有內容都是主隊列鏈接,則幾乎總是表示“是”。 否則沒有。

  2. 相同的答案。 for循環沒有特殊的並發魔術。 它們與任何其他代碼一樣完全可以使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM