Как мне использовать DispatchGroup для двух URL-запросов? - PullRequest
0 голосов
/ 28 мая 2019

Я использую 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()
        }

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Я бы немного изменил рефакторинг для явного входа и выхода из вашей группы по мере необходимости.Использование 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()
    }
}
0 голосов
/ 28 мая 2019

В прошлом у меня была та же проблема, что и у вас, и я узнал немного больше о параллельном процессе в 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-and-operationqueue-tutorial-in-swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...