如何在tableview控制器中显示CloudKit RecordType实例

时间:2016-05-31 23:31:50

标签: swift tableview instance icloud cloudkit

据我所知,以下代码(或非常接近它)将从recordtype数组中检索一个cloudkit实例...

    let pred = NSPredicate(value: true)

    let query = CKQuery(recordType: "Stores", predicate: pred)

    publicDatabase.performQuery(query, inZoneWithID: nil) { (result, error) in

        if error != nil
        {
            print("Error" + (error?.localizedDescription)!)
        }
        else
        {
            if result?.count > 0
            {
                let record = result![0]

                dispatch_async(dispatch_get_main_queue(), { () -> Void in

                    self.txtDesc.text = record.objectForKey("storeDesc") as? String
                    self.position = record.objectForKey("storeLocation") as! CLLocation
                    let img = record.objectForKey("storeImage") as! CKAsset
                    self.storeImage.image = UIImage(contentsOfFile: img.fileURL.path!)
....(& so on)

然而,我将如何以及何时(代码中的物理位置?)进行查询,以便我可以将每个单元格设置为我的DiningType记录中每个实例的信息?

例如,我会在didreceivememory警告函数内查询吗?还是在cellforRowatIndexPath中?或其他!

如果我在上面的代码中误解了,请在笔记中记下来,此时的所有帮助都很有价值,非常感谢。

2 个答案:

答案 0 :(得分:0)

如果没有更多信息,我会对未显示的其余代码做一些假设。我会假设:

  • 您正在使用UITableView显示数据
  • 您的UITableView(tableView)已正确连接到您的viewController,包括正确的Outlet,并将tableViewDataSource和tableViewDelegate分配给您的视图,并为这些协议实现所需的方法。
  • 您的数据(针对每个单元格)存储在某种类型的集合中,如数组(尽管有很多选项)。

当您调用代码从数据库中检索记录时(在本例中为CloudKit),数据最终应存储在您的Array中。当您的Array更改(新数据或更新数据)时,您将调用tableView.reloadData()来告诉tableView某些内容已更改并重新加载单元格。

单元格在tableView(:cellForRowAtIndexPath :)中连接(手动)。它为每个项调用此方法(假设您实现了tableView(:numberOfRowsInSection :)和numberOfSectionsInTableView(_:)

如果您不熟悉使用UITableView,一开始看起来很难。如果您想看一个简单的UITableView连接示例,请告诉我!

答案 1 :(得分:-1)

首先,我必须处理典型的cloudkit要求:设置容器,publicdatabase,谓词和查询输入。然后,我让公共数据库执行查询,在这种情况下,记录类型为“DiningType”。通过程序的第一个if语句,如果发现错误,控制台将打印“错误”并结束进一步的操作。但是,如果未发现运行时问题,则发现与查询相关的每个结果都将附加到viewdidload函数上方创建的categories数组中。

var categories: Array<CKRecord> = []

override func viewDidLoad() {
    super.viewDidLoad()


    func fetchdiningtypes()
    {

        let container = CKContainer.defaultContainer()
        let publicDatabase = container.publicCloudDatabase
        let predicate = NSPredicate(value: true)
        let query = CKQuery(recordType: "DiningType", predicate: predicate)


        publicDatabase.performQuery(query, inZoneWithID: nil) { (results, error) -> Void in
            if error != nil
            {
                print("Error")
            }
            else
            {
                for result in results!
                {
                    self.categories.append(result)
                }

                NSOperationQueue.mainQueue().addOperationWithBlock( { () -> Void in
                    self.tableView.reloadData()


                })
            }
        }

    }

    fetchdiningtypes()