Использование DispatchGroup в onAppear - PullRequest
0 голосов
/ 23 апреля 2020

То, что я пытаюсь достичь, это: 1) получать записи из облачного набора (исключая активы) 2) случайным образом выбрать 3 записи из этих извлеченных записей 3) получить полные 3 записи из облачного набора (включая активы).

Проблема, с которой я борюсь, заключается в том, чтобы 1, 2 и 3 начинались и заканчивались один за другим.

    //...
    .onAppear(){

            let group = DispatchGroup()

            // MARK: - 1) fetch from CloudKit - excluding CKAsset
            CloudKit.fetch() {(result) in
                group.enter() // moving group.enter() above CloudKit.fetch() locks everything up
                switch result {
                case .success(let newItem):
                    self.array.append(newItem)
                    group.leave()
                case .failure(let err):
                    print(err.localizedDescription)
                }
            }
            // MARK: - 2) randomly select 3 records
            group.wait() // doesn't actually wait as this is executed before group.enter()
            self.array.shuffle()
            let firstSelection = self.array[0].recordID!
            let firstSelection = self.array[1].recordID!
            let firstSelection = self.array[2].recordID!

            // MARK: - 3) fetch recordID from CloudKit - includes CKAsset
            CloudKit.fetchRecord(recordID: self.array[0]) {(result) in
                switch result {
                case .success(let newItem):
                    self.arrayRandomlySelected.append(newItem)
                case .failure(let err):
                    print(err.localizedDescription)
                }
            }
            // run for remaining 2 records and move to next view when done
    }

Я пытался использовать DispatchGroup(), но group.wait() вызывается раньше group.enter(). Я правильно использую DispatchGroup() или мне следует попробовать что-то еще?

...