結果:実行される
実行したコード:
import Foundation
let dispatchGroup = DispatchGroup()
for i in 0..<3 {
print(i, "enter start")
dispatchGroup.enter()
print(i, "enter did")
DispatchQueue.main.async {
DispatchQueue.main.async {
print(i, "- inner enter start")
dispatchGroup.enter()
print(i, "- inner enter did")
sleep(1)
print(i, "- inner leave start")
dispatchGroup.leave()
print(i, "- inner leave did")
}
print(i, "leave start")
dispatchGroup.leave()
print(i, "leave did")
}
sleep(1)
}
dispatchGroup.notify(queue: .main) {
print("notify")
}
結果:
0 enter start
0 enter did
1 enter start
1 enter did
2 enter start
2 enter did
0 leave start
0 leave did
1 leave start
1 leave did
2 leave start
2 leave did
0 - inner enter start
0 - inner enter did
0 - inner leave start
0 - inner leave did
1 - inner enter start
1 - inner enter did
1 - inner leave start
1 - inner leave did
2 - inner enter start
2 - inner enter did
2 - inner leave start
2 - inner leave did
notify
まとめると、
- 外側が全部 enter
- 外側が全部 leave
- 内側がそれぞれ enter → leave
- notify
途中で enter 数 == leave 数 になっても、
まだ enter していない部分があれば
notify されないみたい。