首先:我在CloudKit和#34; dispatch" -mechanisms中真的很陌生。
但是我想在swift中编写一个函数,它将查询结果作为数组返回。现在我的问题是,该函数不会等待查询完成,因此我收到一个空数组。我的数据库中有记录但是我没有正确地恢复它。
正如我所说的,我并不是真的了解整个dispatch_async-mechanism等。我还阅读了关于CloudKit的raywenderlich.com上的教程,但我仍然没有得到,我怎么能正确返回数组。
这是我的实际代码。我经常看到人们使用dispatch_async
- 方法,但我真的不明白他们如何返回我的阵列。
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
}
}
}
答案 0 :(得分:0)
你不应该让你的函数返回数据。这样,只有在实现等待机制(通常使用信号量)时,它才会起作用。如果您这样做,则会在数据提取期间阻止您的应用。
相反,你应该返回虚空,而不是回到你的商店,你应该调用商店的新功能。在那里你应该继续加工商店。所以你的功能将是:
func loadMyShopsCoolAwesome() {
...
而不是
return myShops
你应该调用一个新函数。类似的东西:
processShops(myShops)
然后会调用一个看起来像这样的新函数:
func processShops(shops: [Shops]) {
// do work with shops
...
}
另请注意,这将在后台队列中调用。因此,如果您想对接口执行某些操作,请在主队列中调用,如下所示:
NSOperationQueue.mainQueue().addOperationWithBlock {
...
}