从cloudkit-query获取结果

时间:2015-01-04 23:31:02

标签: arrays swift cloudkit dispatch-async

首先:我在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
            }
        }



    }

1 个答案:

答案 0 :(得分:0)

你不应该让你的函数返回数据。这样,只有在实现等待机制(通常使用信号量)时,它才会起作用。如果您这样做,则会在数据提取期间阻止您的应用。

相反,你应该返回虚空,而不是回到你的商店,你应该调用商店的新功能。在那里你应该继续加工商店。所以你的功能将是:

func loadMyShopsCoolAwesome() {
...

而不是

return myShops

你应该调用一个新函数。类似的东西:

processShops(myShops)

然后会调用一个看起来像这样的新函数:

func processShops(shops: [Shops]) {
   // do work with shops
   ...
}

另请注意,这将在后台队列中调用。因此,如果您想对接口执行某些操作,请在主队列中调用,如下所示:

NSOperationQueue.mainQueue().addOperationWithBlock {
      ...
}