Суть многопоточности заключается в том, что операции будут выполняться параллельно и независимо друг от друга. Это не гарантирует никакой порядок, никакой синхронизации и ничего. Если вам нужно синхронизировать вещи, вам нужно использовать один поток или третий поток, который отправляет работу:
func foo() {
let firstQueue = DispatchQueue(label: "queue1")
let secondQueue = DispatchQueue(label: "queue2")
let mainQueue = DispatchQueue(label: "queueMain")
var firstQueueOperationsCount: Int = 10
var secondQueueOperationsCount: Int = 10
func performOperations() {
guard max(firstQueueOperationsCount, secondQueueOperationsCount) > 0 else {
return
}
mainQueue.async {
if firstQueueOperationsCount > secondQueueOperationsCount {
firstQueueOperationsCount -= 1
firstQueue.async {
print("?")
performOperations()
}
} else {
secondQueueOperationsCount -= 1
secondQueue.async {
print("⚪️")
performOperations()
}
}
}
}
performOperations()
}
Существует множество способов сериализации задач, отправляемых в несколько потоков, и это только один из них. Вы можете попробовать поискать / прочитать в этом направлении, но просто будьте ясны: то, что вы ожидаете от многопоточности, - это НЕ ЧТО ТАКОЕ МУЛЬТИТРЕЙДИНГ. Это не работает таким образом, и это не должно работать таким образом. Как они работают, это то, как мы хотим, чтобы это работало.
Если у вас более конкретная ситуация, я уверен, что сообщество здесь может помочь вам найти хороший подход для ее решения. Но из того, что вы написали, результат не многопоточность, а:
for i in 0..<10 {
print("?")
print("⚪️")
}
Он может быть отправлен в другой поток, но это действительно не имеет значения.