繁体   English   中英

如何在异步调用完成并且代码在swift3中的asyn函数之外运行代码

[英]How do you run code after an async call finishes and the code is outside of the asyn function in swift3

我有一个包含帖子ID的数组,然后执行for循环并检索每个帖子内容,并将帖子附加到post数组。 循环结束后,我需要在完成处理程序中返回post数组。

但是,.observeSingleEvent是一个异步方法,因此,从Firebase检索帖子内容,已经执行了completionhandler(posts),这将返回一个空数组。 我想在每个帖子追加到数组后返回数组,类似于使这些方法同步。

static func getPost(postKeys:[String], completionHandler: @escaping ([Post])->()){
    var posts = [Post]()
    for postKey in postKeys{
        let postRef = DataService.ds.REF_POSTS.child(postKey)
        postRef.observeSingleEvent(of: .value, with: { (snapshot) in
            if let postDict = snapshot.value as? Dictionary<String, Any>{
                //create a post and append it to the post array
                let key = snapshot.key
                let post = Post(postKey: key, postData: postDict)
                posts.append(post)
            }
        })
    }
    completionHandler(posts)
}

一系列任务完成后,可以使用DispatchGroup执行一些代码。

在开始任务之前先调用enter函数,在任务完成后先调用leave函数。 您可以使用notify提供一个闭包,当所有任务都“离开” DispatchGroup将执行该闭包。

您还需要注意避免在更新数组时出现并发问题。 Swift数组不是线程安全的。 在串行调度队列上执行阵列更新可以解决此问题。

static func getPost(postKeys:[String], completionHandler: @escaping ([Post])->()){
    var posts = [Post]()
    let dispatchGroup = DispatchGroup()
    let arrayQueue = DispatchQueue(label: "arrayQueue")
    for postKey in postKeys{
        dispatchGroup.enter()
        let postRef = DataService.ds.REF_POSTS.child(postKey)
        postRef.observeSingleEvent(of: .value, with: { (snapshot) in
            if let postDict = snapshot.value as? Dictionary<String, Any>{
                //create a post and append it to the post array
                let key = snapshot.key
                let post = Post(postKey: key, postData: postDict)
                arrayQueue.sync {
                    posts.append(post)
                }
            }
            dispatchGroup.leave()
        })
    }

    dispatchGroup.notify(queue: DispatchQueue.main) { 
        completionHandler(posts)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM