[英]Get results from cloudkit-query
第一:我真的很了解CloudKit和“调度”机制。
但我想快速编写一个函数,该函数将查询结果作为数组返回。 现在我的问题是,该函数不等待查询完成,因此我收到一个空数组。 我的数据库中有记录,但是我没有正确地将其取回。
因此,正如我说的那样,我并不十分了解整个dispatch_async-mechanism等。我还阅读了raywenderlich.com上有关CloudKit的教程,但仍然不明白如何正确返回数组。
这是我的实际代码。 我经常看到人们使用dispatch_async
-methods,但是我真的不明白他们如何返回我的数组。
func loadMyShopsCoolAwesome() ->[Shops]{
let container = CKContainer.defaultContainer()
var publicDB = container.publicCloudDatabase
let myQuery = CKQuery(recordType: "Shops", predicate: NSPredicate(value: true))
var myShops = [MyShops]()
publicDB.performQuery(myQuery, inZoneWithID: nil) {
results, error in
if error != nil {
println(error)
} else {
for record in results{
let shop = MyShops(nameElementAt: record.objectForKey("nameElementAt") as Int, nameElementFromSplit: record.objectForKey("nameElementFromSplit") as Int, nameSplitString: record.objectForKey("nameSplitString"), priceElementAt: record.objectForKey("priceElementAt") as Int, priceSplitString: record.objectForKey("priceSplitString"), shopName: record.objectForKey("shopName"), shopURL: record.objectForKey("shopURL"), xPathName: record.objectForKey("xPathName"), xPathPrice: record.objectForKey("xPathPrice"))
myShops.append(shop)
}
return myShops
}
}
}
您不应该让函数返回数据。 这样,只有在实现了等待机制(通常使用信号量)后,它才起作用。 如果这样做,则会在数据获取期间阻止您的应用程序。
相反,您应该返回void,而不是返回商店,而应该使用商店调用新函数。 在那里,您应该继续处理商店。 因此,您的功能将是:
func loadMyShopsCoolAwesome() {
...
而不是
return myShops
您应该调用一个新函数。 就像是:
processShops(myShops)
然后它将调用一个新函数,如下所示:
func processShops(shops: [Shops]) {
// do work with shops
...
}
另请注意,这将在后台队列中调用。 因此,如果您想对接口做一些事情,可以在主队列上这样调用它:
NSOperationQueue.mainQueue().addOperationWithBlock {
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.