呼ば取得後すぐに実行を開始する必要があります。私はそれを100回呼び出すことによってテストし、コールバックはエンキューされたのと同じ順序で実行されます。
さらに、100個のキューを持つことでテストを行い、並列性がどのように動作するかを確認し、コールバックはキューに入れられたときと同じ順序で実行されます。だから、結論はasyncAfter(.nowは())非同期と同じであることである:
func testOneThread() {
var lastCallbackRun = 0
for i in 1...100 {
DispatchQueue.main.asyncAfter(.now()) {
assert(lastCallbackRun < i)
lastCallbackRun = i
if i == 100 {
NSLog("done")
}
}
}
}
func testAsync() {
for _ in 0...100 {
let q = DispatchQueue(label: "whatever")
q.async(execute: testOneThread)
Unmanaged<DispatchQueue>.passRetained(q)
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
testAsync()
// The rest of it.
}
}
はどうもありがとうございました。 –