Swift-与DispatchGroup()异步从Firebase Firestore下载数据时出现问题

时间:2019-01-08 18:45:52

标签: ios swift firebase

在“事件”集合中获取其EventStatus值等于0的每个文档的ID并将它们存储在字符串数组(documentIds)中时,我尝试使用DispatchGroup()异步运行代码,因此当我返回“ documentIds”时,我将返回一个非空且完整的值。

但是当我运行下面的代码时,它冻结了,实际上它从未在getDocuments {}闭包中运行。

我试图在DispatchQueue.global()。async {}中运行getDocuments {}闭包,但它也无法正常工作。

func someFunction() -> [String] {

var documentIds : [String]!
var dispatchGroup = DispatchGroup()
dispatchGroup.enter()

Firestore.firestore().collection("events").whereField("EventStatus", isEqualTo: 0).getDocuments { (snap, error) in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        guard let snap = snap else { return }

        documentIds = snap.documents.map({ (document) -> String in
            return document.documentID
        })

        dispatchGroup.leave()

    }

dispatchGroup.wait()
return documentIds

}

当冻结时,firebase在调试控制台中给出了此错误:

“无法到达Cloud Firestore后端。后端在10秒钟内没有响应。  这通常表明您的设备目前没有正常的Internet连接。客户端将以脱机模式运行,直到能够成功连接到后端为止。”

除此之外,没有错误或其他反馈。我对DispatchGroup()或Firestore做错了吗?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这是dispatchGroup无效并导致许多错误的情况之一。

由于从Firestore检索数据是异步调用,因此请对方法使用完成处理程序,而不要返回值并摆脱dispatchGroup

func someFunction(completion: @escaping ([String]) -> Void) {

    Firestore.firestore().collection("events").whereField("EventStatus", isEqualTo: 0).getDocuments { snap, error in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        guard let snap = snap else { return }

        var documentIds = snap.documents { document in
            return document.documentID
        }

        completion(documentIds)
    }

}

然后使用完成处理程序调用您的方法,您可以在其中访问收到的String数组

someFunction { documentIds in // name completion parameter of type `[String]`
    ... // assign some global array as `documentIds` and then reload data, etc.
}