如何在加载 TableData 之前从 CloudKit 获取数据

How to get data from CloudKit before loading TableData

我正在 Swift 中编写一个应用程序,其中第一个场景有一个 TableView,我将它设置为显示标题并且它工作正常,我还设置它以计算 CloudKit 数据库(或任何它的名字),但它以异步方式执行计数,因此 table 默认在详细信息窗格中显示 0。

我需要知道如何让应用在为正确的详细信息设置值之前等待,直到计数完成或如何在之后更改它们。

我附上了我用来执行计数等的代码,如果我做错了或效率低下,请告诉我

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true;

    self.textArray.addObject("Link 300")
    self.textArray.addObject("Link 410")
    self.textArray.addObject("Link 510")

    let container = CKContainer.defaultContainer()
    let publicData = container.publicCloudDatabase

    let query = CKQuery(recordType: "Inventory", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))

    publicData.performQuery(query, inZoneWithID: nil){results, error in
        if error == nil {
            for res in results {
                let record: CKRecord = res as! CKRecord

                if(record.objectForKey(("TrackerModel")) as! String == "Link 300"){
                    self.count300 = self.count300++
                }else if(record.objectForKey(("TrackerModel")) as! String == "Link 410"){
                    self.count410 = self.count410++
                }else if(record.objectForKey(("TrackerModel")) as! String == "Link 510"){
                    self.count510 = self.count510++
                }
            }
        }else{
            println(error)
        }
    }

    self.detailArray.addObject(self.count300.description)
    self.detailArray.addObject(self.count410.description)
    self.detailArray.addObject(self.count510.description)
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.textArray.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->UITableViewCell {
    var cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as! UITableViewCell
    cell.textLabel?.text = self.textArray.objectAtIndex(indexPath.row) as? String
    cell.detailTextLabel?.text = self.detailArray.objectAtIndex(indexPath.row) as? String
    return cell
}

非常感谢 - 罗比

performQuery 关联的闭包将异步完成 - 即在 viewDidLoad 完成之后。您需要确保在查询完成并获得数据后重新加载 table 视图。您还遇到了一个问题,因为您正在闭包之外更新总计 - 此代码也会在数据加载之前执行。

最后,确保 UI 的任何更新(例如重新加载 table 视图)都在主队列

上调度
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true;

    self.textArray.addObject("Link 300")
    self.textArray.addObject("Link 410")
    self.textArray.addObject("Link 510")

    let container = CKContainer.defaultContainer()
    let publicData = container.publicCloudDatabase

    let query = CKQuery(recordType: "Inventory", predicate: NSPredicate(format: "TRUEPREDICATE", argumentArray: nil))

    publicData.performQuery(query, inZoneWithID: nil){results, error in
        if error == nil {
            for res in results {
                let record: CKRecord = res as! CKRecord

                if(record.objectForKey(("TrackerModel")) as! String == "Link 300"){
                    self.count300++
                }else if(record.objectForKey(("TrackerModel")) as! String == "Link 410"){
                    self.count410++ 
                }else if(record.objectForKey(("TrackerModel")) as! String == "Link 510"){
                    self.count510++
                }
            }
            self.detailArray.addObject(self.count300.description)
            self.detailArray.addObject(self.count410.description)
            self.detailArray.addObject(self.count510.description)
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.tableView.reloadData()
            })
        }else{
            println(error)
        }
    }
}