gpt4 book ai didi

swift - 如何修复附加函数的异步性质?

转载 作者:可可西里 更新时间:2023-11-01 02:10:22 24 4
gpt4 key购买 nike

我设置了一个查询以从数据库(由 heroku 托管的 Parse-server)中提取数据并将其附加到数组;在这个查询中是另一个查询,用于从不同的类中提取信息,但也用于附加另一个数组。我认为因为我使用 .findObjectsinBackground 它是异步发生的,这导致了一个问题。这是代码(通用):

    func getQueries(completion: (() -> Void)?){

let searchQuery = PFQuery(className: "Etc")
searchQuery.findObjectsInBackground(block: { (objects, error) in

if let objectss = objects{

for object in objectss {
//append some arrays
let otherQuery = PFQuery(className: "OtherClass")
otherQuery.whereKey("user", equalTo: object["User"] as String)
otherQuery.findObjectsInBackground(block: {(objects, error) in
if let objectss = objects{
for object in objectss{
array.append(object["ProfPic"] as PFFile)
print("\(array) and its count is \(array.count)") //this returns a non 0 value
}
}
completion!()
})

print("\(array) and its count is \(array.count)") //this returns 0
}
}
})
}

array 的计数一旦被附加到它自己的闭包中就返回为非 0,但在其闭包之外返回为 0。这是一个问题,因为数组用于迭代显示信息。无论如何要确保在searchQuery 的整体关闭完成之前,otherQuery 的追加已经完成?(此外,它是异步发生导致问题的事实是一种猜测......我可能是错的)

最佳答案

在后一种情况下,您将在获取数据之前打印计数,例如在 findObjectsInBackground 的完成 block 之外。

您可以使用完成 block 将整个事情包装在自己的方法中:

func fetchData(_ completion: () -> Void) {

searchQuery.findObjectsInBackground(block: { (objects, error) in
guard let objectss = objects else {
completion()
}

for object in objectss {
let otherQuery = PFQuery(className: "OtherClass")
otherQuery.whereKey("user", equalTo: object["User"] as String)
otherQuery.findObjectsInBackground(block: {(objects, error) in

guard let objectss = objects else {
completion()
}

for object in objectss{
array.append(object["ProfPic"] as PFFile)
}

print("In loop: \(array) and its count is \(array.count)")
completion()
})
}
})
}

而且比这更重要的是:

fetchData() {
print("After completing: \(array) and its count is \(array.count)")
// do stuff with your fetched data and display it
// "use in iterating through to display information" here
}

更新:

在您更新的问题中,您仅在成功案例中调用 completion!()。在任何情况下你都必须调用它:

...
if let objectss = objects
...
completion!()
} else {
completion!()
}
...

关于swift - 如何修复附加函数的异步性质?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41189469/

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