[英]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.