如何确保查询发生在同一函数内的另一个查询之前?
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
我有一个函数,其中设置了多个查询。函数比较长,涉及面也比较广,但是完美,除了一期。有一个查询依赖于之前查询的一些信息,当之前的查询没有完全完成并导致第二个查询解包一个 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