Swift DispatchGroup вызывает ошибку: [Firebase / Firestore] [I-FST000001] Не удалось связаться с бэкэндом Cloud Firestore - PullRequest
0 голосов
/ 19 февраля 2019

Я использую Firebase & Firestore для чтения данных, используя:

var itemData: [String:Any]?
let docRef = db.collection("store").document(documentID)

let group = DispatchGroup()
group.enter()
DispatchQueue.global().async {
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            print("Document data: \(document.data() ?? ["key":"__data__"])")
            itemData = document.data()
        } else {
            print("Document does not exist")
        }
        group.leave()
    }
}
group.wait()
print("ITEM_DATA: \(itemData)")
return itemData

, когда я удаляю все ссылки на любую DispatchGroup, group.enter () и т. Д ... код работает нормально, хотя и нев том порядке, в котором я этого хочу (т. е. он запускает строку print("ITEM_DATA: \(itemData)") с itemData как nil и только позже выводит результат print("Document data: \(document.data() ?? ["key":"__data__"])")).Так что я знаю, что с настоящим запросом в Firebase все в порядке.

Однако, когда я пытаюсь решить проблему с печатью / возвратом itemData перед тем, как писать в нее, с помощью DispatchGroup, как в коде выше, когда я запускаю функцию, программа выдает мне ошибкукод:

[Firebase/Firestore][I-FST000001] Could not reach Cloud Firestore backend. Backend didn't respond within 10.000000 seconds.
This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.

Программа не подключается к Firestore после получения этого сообщения.Я пробовал это на симуляторах и реальных устройствах как с Wi-Fi, так и без него, но безрезультатно.Я знаю, что это не проблема с моим интернет-соединением, потому что оно работает, когда я удаляю все вещи с DispatchGroup, но я все еще не могу понять, в чем проблема или как обойти эту проблему.

1 Ответ

0 голосов
/ 19 февраля 2019

Попробуйте войти и выйти из группы отправки, находящейся в одной и той же Queue

let group = DispatchGroup()
DispatchQueue.global().async {
    group.enter()
    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            print("Document data: \(document.data() ?? ["key":"__data__"])")
            itemData = document.data()
        } else {
            print("Document does not exist")
        }
        group.leave()
    }
}
group.wait()
print("ITEM_DATA: \(itemData)")

Если вам интересно, что я изменил в вашем методе?

Посмотрите на оператор ввода, перемещающийся внутри DispatchQueue асинхронное закрытие

Что может быть причиной проблемы?

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

РЕДАКТИРОВАТЬ 1:

Эй, просто проверил ваш код и заставил его работать

let group = DispatchGroup()
    DispatchQueue.global().async {
        group.enter()
        sleep(10)
        debugPrint("Hello")
        group.leave()
    }
    group.notify(queue: DispatchQueue.main) {
        print("ITEM_DATA: )")
    }

Вот последовательность вывода из консоли

  1. "Привет"
  2. ITEM_DATA:)

Я знаю, что не использую wait()и wait() также должен работать, но немного занят своей работой, поэтому не могу сейчас тестировать с ожиданием

РЕДАКТИРОВАТЬ 2:

Просто понял, что OP намереваетсявернуть значение из асинхронной функции, используя Dispatch group, следовательно, обновив мой ответ для того же

Вы не можете получить возвратутверждение от асинхронного вызова независимо от того, какую логику вы применяете.Группа рассылки вам здесь не поможет, все что вам нужно здесь это closure или block

func test(onCompletion completion: @escaping ([String:Any]) -> ()) {
    DispatchQueue.global().async {
        docRef.getDocument { (document, error) in
            if let document = document, document.exists {
                completion(document.data())
            }
        }
    }
}

И называйте это как

    self.test {[weak self] (data) in
        debugPrint(data)
    } 

Надеюсь, это поможет

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