繁体   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