gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 07:15:11 26 4
gpt4 key购买 nike

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

最佳答案

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

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

关于swift - 如何确保查询发生在同一函数内的另一个查询之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com