GCD проблема с многопоточностью


#1

Есть такой вот код.

class Service {
    func fetch(completion: @escaping ([Int]) -> Void) {
        DispatchQueue.global().asyncAfter(deadline: .now() + 5) {
            DispatchQueue.main.async {
                completion([1,1])
            }
        }
    }
}
class Provider {
    let service = Service()
    var result: [Int] = []
    let queue = DispatchQueue(label: "Foo")

    func fetch() {
        print("1")
        queue.async(flags: .barrier) {
            print("2")
            self.service.fetch { (result) in
                print("3")
                self.result = result
            }
        }
    }

    func getBool(index: Int) -> Int {
        print("4")
        var res: [Int] = []
        queue.sync {
            res = self.result
        }
        print("5")
        return index < res.count ? res[index] : -1
    }
}

let p = Provider()

p.fetch()
print(p.getBool(index: 0))
print(p.getBool(index: 1))

Выводит в результате:

1
2
4
5
-1
4
5
-1
3

Проблема, как 3-ку втиснуть в нужное место? Т.е. надо как-то процесс тормознуть и дождаться пока не выполниться функция fetch.

В данном примере использую barrier, но это не правильно. =(
Заранее спасибо за любую помощь


#2
func fetch(completion: () -> ()) {
        print("1")
        queue.async(flags: .barrier) {
            print("2")
            self.service.fetch { (result) in
                print("3")
                self.result = result
                completion()
            }
        }
    }


let p = Provider()

p.fetch() {
    print(p.getBool(index: 0))
    print(p.getBool(index: 1))
}

#3

так я уже делал. А без этого никак?
Получается, раз мы @escaping применяем в замыканиях, то их уже нельзя синхронно вызывать?


#4

Попробуйте промисы, жить станет легче :slight_smile:


#5

ссылки на сабж приветствуются для нубов )))


#6

Есть популярная

Я использую эту из Яндекс денег


#7

Не, спасибо. Но лучше решать задачу исходя из требуемых условий. Скоро Combine всех порвет )))


#8

Когда в этой строке будет стоять iOS 13

Лет через 5, и это я оптимист :slight_smile:


#9

Да вы батенька оптимист :slight_smile: