想使用DispatchQueue.global()。async和main.async,但是效果不佳

时间:2019-02-06 17:10:31

标签: swift asynchronous

我想通过DispatchQueue.global()。async和DispatchQueue.main.async将异步任务用于我的应用程序,但这不起作用。

我想从firebase中获取数据,然后创建List并将其传递给闭包。但是在下面的代码中,首先调用的是计时完成,然后调用posts.append。

func retrieveData(completion: @escaping ([Post]) -> Void) {

    var posts: [Post] = []
    let postsColRef = db.collection("posts").order(by: "createdAt").limit(to: 3)

    postsColRef.getDocuments() { (querySnapshot, error) in
        if let error = error {
            print("Document data: \(error)")
        } else {
            DispatchQueue.global().async {
                for document in querySnapshot!.documents {
                    let data = document.data()
                    let userId = data["userId"] as? String
                    let postImage = data["postImageURL"] as? String
                    let createdAt = data["createdAt"] as? String

                    let docRef = db.collection("users").document(userId!)

                    docRef.getDocument() { (document, error) in
                        if let document = document, document.exists {

                            let data = document.data()!
                            let userName = data["userName"] as? String

                            let post = Post(
                                userId: userId!,
                                userName: userName!,
                                postImageURL: postImage!,
                                createdAt: createdAt!
                            )

                            print("When append called")
                            posts.append(post)

                        }
                    }
                }
                DispatchQueue.main.async {
                    print("When completion called")
                    print(posts)
                    completion(posts)
                }
            }
        }
    }
}

我想先完成for循环,然后再完成。有人可以给我任何想法吗?

1 个答案:

答案 0 :(得分:0)

我刚刚找到了这个问题(Wait until swift for loop with asynchronous network requests finishes executing)并尝试了下面的代码,它可以正常工作。对每个检查过这个问题的人都感到抱歉。从下一次开始,我将首先搜索现有问题。谢谢。

/-(\d+)$/