Модификация массива из асинхронного вызова без модификации массива swift - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь изменить массив объектов, которые я извлекаю из асинхронного вызова, с результатами другого асинхронного вызова.В основном я получаю массив результатов, и есть поле messages, которое возвращается ноль из моего вызова на сервере.Затем мне нужно сделать еще один серверный вызов с id каждого result в цикле for, чтобы получить массив messages.Затем я устанавливаю messages на возвращаемое значение.

Я только что узнал об использовании DispatchGroup () около 20 минут назад от https://stackoverflow.com/a/48718976/3272438,, так что терпите меня.

Проблема, которую я получаю, заключается в том, что когда я выполняю print ("C0: (self.res)") , он распечатывает все элементы, включая messages, который я только что добавил.Когда print ("C2: (self.res)") печатает в group.notify(...), все поля messages выводят nil .Я в тупике и перепробовал все, что мог придумать.Любая помощь будет высоко ценится.

ОБНОВЛЕНИЕ При изменении следующей group.notify () никогда не вызывается

Service.getMessages(resultId: self.res![index].id, completionHandler: { (latestMessage, response, error) in

        if let latestMessage = latestMessage {
            self.res![index].messages = [latestMessage]
            print("L2: \(self.res![index].messages)")
            print("C0: \(self.res)")
        }
        group.leave() // continue the loop
    })

ViewController.Swift

var res: [ResultDTO]?

override func viewDidLoad() {
    super.viewDidLoad()

    let group0 = DispatchGroup()

    group0.enter()
    Service.getResults { (results, response, error) in
        guard var results = results else { print("PROBLEM"); return }
        self.res = results
        group0.leave()
    }

    group0.notify(queue: .main) {
        print("in group0")
        let group = DispatchGroup() // initialize
        for index in 0..<self.res!.count {
            group.enter() // wait
            Service.getMessages(resultId: self.res![index].id, completionHandler: { (latestMessage, response, error) in

                if let latestMessage = latestMessage {
                    self.res![index].messages = [latestMessage]
                    print("L2: \(self.res![index].messages)")
                    print("C0: \(self.res)")
                }

            })
            group.leave() // continue the loop
        }

        group.notify(queue: .main) {
            print("In group notify")

            do {
                print("C2: \(self.res)")
                for index in 0..< self.res!.count {
                    print("L4: \(self.res![index].messages)")
                }
                // ... configure my view with the data
            } catch {
                print("Error: \(error)")
            }

        }
    }

}

1 Ответ

0 голосов
/ 30 мая 2019

Я бы упростил вашу обработку данных, используя одну группу рассылки (поскольку вам нужна только одна):

class YourViewController: UIViewController {

    private var results: [ResultDTO]?

    override func viewDidLoad() {
        super.viewDidLoad()
        getResults()
    }

    private func getResults() {

        Service.getResults { (results, response, error) in

            guard let results = results,
                results.count > 0 else {
                    return
            }

            let dispatchGroup = DispatchGroup()

            for r in results {

                dispatchGroup.enter()
                Service.getMessages(resultId: r.id, completionHandler: { (latestMessage, response, error) in

                    if let latestMessage = latestMessage {
                        r.messages = [latestMessage]
                    }
                    dispatchGroup.leave()

                }

            }

            dispatchGroup.notify(queue: .main, execute: {
                self.results = results
            })

        }

    }

}

Считайте, что это только отправная точка.Если бы это был рабочий код, я бы реализовал обработку ошибок и фоновую организацию очередей (при условии, что данные возвращаются в основном потоке).

...