如何确保查询发生在同一函数内的另一个查询之前?

How to ensure a query happens before another query within the same function?

我有一个函数,其中设置了多个查询。函数比较长,涉及面也比较广,但是完美,除了一期。有一个查询依赖于之前查询的一些信息,当之前的查询没有完全完成并导致第二个查询解包一个 nil 值时,它偶尔会使应用程序崩溃。这是一般设置:

func QueryandAppend(completion: (() -> Void)?){
    let userLinkQuery = PFUser.query()//query1
    userLinkQuery?.findObjectsInBackground(block: { (objects, error) in
        if let users = objects{
            for object in users{
                if let user = object as? PFUser{
                    userLinkArray[user.objectId!] = user.username
                }
            }
        }
        })

        let appendingQuery = PFQuery(classname: "Stuff")//query2
            appendingQuery.findObjectsInBackground { (objects, error) in
            for object in objects{
               creatorArray.append(userLinkArray[object["User"] as! String]!)
            }
            ...
            completion!()

    }

完成处理程序用于确保在 运行在 viewDidLoad() 中执行某些操作之前完成整个函数(以及所有查询)。但是,我如何确保 中函数 query1 在 query2 可以 运行 之前完成?

对网络和其他异步操作执行此操作的原型方法是将操作链接起来,甚至可能将各个网络操作分解为特定的例程。各个操作都有完成回调,因此只需从第一个例程的完成调用第二个例程。

func QueryandAppend(completion: ((Bool) -> Void)?) {
    PFUser.query().findObjectsInBackground { (objects, error) in
        guard error == nil, let users = objects else {
            completion?(false)
            return
        }

        for object in users {
            if let user = object as? PFUser,
                let objectId = user.objectId {
                userLinkArray[objectId] = user.username
            }
        }

        PFQuery(classname: "Stuff").findObjectsInBackground { (objects, error) in
            if error != nil {
                // Handle error case
                completion?(false)
                return
            }

            for object in objects {
                creatorArray.append(userLinkArray[object["User"] as! String]!)
            }

            completion?(true)
        }
    }
}

或者,对于更现代的风格方法,您可以查看一个好的 Promise 框架,例如 PromiseKit