Я использую DispatchGroup для двух URL-запросов, но не получил никаких данных. Я пробовал каждый метод отдельно без DispatchGroup, он отлично работает. Так что проблема в том, что я не использовал DispatchGroup правильно. Пожалуйста помоги.

    let buildingManager =  BuildingManager()
    let anaManager = AnalyticsManager()
    let group = DispatchGroup()
    let queue = DispatchQueue.global(qos: .background)

    queue.async(group: group) {
        buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
            guard let self = self else {return}

            if success {
                self.buildings = buildings
                print("success")
            } else {
                print("No building infos")
            }
        })
    }

    queue.async(group: group) {
        anaManager.getAnaData(completion: {[weak self] (anaData, success) in
            guard let self = self else {return}

            if success {
                self.analyticsData = anaData
                print("success")
            } else {
                print("No analytics data")
            }
        })
    }

        group.notify(queue: DispatchQueue.main) { [weak self] in
            self?.dataTableView.reloadData()
        }
0
Mike 28 Май 2019 в 21:19

2 ответа

Лучший ответ

Я бы немного изменил рефакторинг, чтобы явно входить и выходить из вашей группы по мере необходимости. Использование queue.async(group:) следует использовать только тогда, когда код в блоке уже не является асинхронным.

let buildingManager =  BuildingManager()
let anaManager = AnalyticsManager()
let group = DispatchGroup()
let queue = DispatchQueue.global(qos: .background)

queue.async {
    group.enter()
    buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
        defer { group.leave() }

        guard let self = self else {return}

        if success {
            self.buildings = buildings
            print("success")
        } else {
            print("No building infos")
        }
    })

    group.enter()
    anaManager.getAnaData(completion: {[weak self] (anaData, success) in
        defer { group.leave() }

        guard let self = self else {return}

        if success {
            self.analyticsData = anaData
            print("success")
        } else {
            print("No analytics data")
        }
    })

    group.notify(queue: DispatchQueue.main) { [weak self] in
        self?.dataTableView.reloadData()
    }
}
1
rmaddy 28 Май 2019 в 18:38

В прошлом у меня была та же проблема, что и у вас, и я узнал немного больше о параллельном процессе в Swift. Я могу ошибаться, но на вашем месте я бы использовал OperationQueue. Вы можете попробовать сделать это:

let queue = OperationQueue()

queue.addOperation {
 buildingManager.getBuildingInfos(completion: { [weak self] (buildings, success) in
            guard let self = self else {return}

            if success {
                self.buildings = buildings
                print("success")
            } else {
                print("No building infos")
            }  

            DispatchQueue.main.async {
                self?.dataTableView.reloadData()
            }
        })
}

queue.addOperation {
 anaManager.getAnaData(completion: {[weak self] (anaData, success) in
            guard let self = self else {return}

            if success {
                self.analyticsData = anaData
                print("success")
            } else {
                print("No analytics data")
            }

                DispatchQueue.main.async {
                    self?.dataTableView.reloadData()
                }
        })
}
  • Это скорее мнение, чем ответ.

Ссылка: https://www.raywenderlich.com/5293 -operation - и - operationqueue - учебник -в- стрижа

0
Augusto 28 Май 2019 в 18:36