Использование DispatchGroup для заполнения массива объекта не работает должным образом - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь заполнить массив моего объекта большим количеством объектов. Я использовал группу рассылки без проблем, но теперь, когда мне нужно использовать массив, он не работает. Я получаю массив пустым, как если бы он никогда не был заполнен. Я не очень знаком с GCD, и я хотел бы получить совет о том, что я делаю неправильно.

В первый раз, когда я использую GCD с клиентом, он работает, но когда я использую его снова для всех элементов, это не так. Я почему-то знаю, что он не ожидает обработки всех элементов и отправляет пустой массив, инициализированный с начала.

Надеюсь, кто-нибудь может мне помочь с этим. Ура! * * 1005

static func loadAll(_ completion: @escaping ([Ticket1]?) -> Void) -> UInt {
    return FirebaseService.instance.readAll(from: .tickets, returning: Ticket1.self, { (tickets) in
        if tickets != nil {
            var result = [Ticket1]()
            let dispatchGroup = DispatchGroup()

            for var ticket in tickets! {
                dispatchGroup.enter()
                Customer.loadSingleObject(withID: ticket.customerID, { (customer) in
                    if customer != nil {
                        ticket.customer = customer

                        for itemID in ticket.itemsID {
                            dispatchGroup.enter()
                            Item.loadSingleObject(withID: itemID, { (item) in
                                if item != nil {
                                    ticket.items?.append(item!)
                                } else {
                                    completion(nil)
                                }
                                dispatchGroup.leave()
                            })
                        }
                        result.append(ticket)
                    } else {
                        completion(nil)
                    }
                    dispatchGroup.leave()
                })
            }

            dispatchGroup.notify(queue: .main, execute: {
                result = result.sorted(by: { $0.createdAt > $1.createdAt })
                completion(result)
            })
        } else {
            completion(nil)
        }
    })
}
...