簡體   English   中英

從cloudkit-query獲取結果

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM