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

标签 ios iphone swift tableview

我正在用 Swift 编写一个应用程序,其中第一个场景有一个 TableView,我将它设置为显示标题并且它工作正常,我还设置它以计算 CloudKit 数据库(或任何它的名称)中的出现次数但它以异步方式执行计数,因此表默认在详细信息 Pane 中显示 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完成之后。您需要确保在查询完成并且获得数据后重新加载 TableView 。您还遇到一个问题,因为您正在闭包之外更新总计 - 此代码也会在数据加载之前执行。

最后,确保对 UI 的任何更新(例如重新加载 TableView )都在主队列上调度

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)
        }
    }
}

关于ios - 加载TableData之前如何从CloudKit获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257741/

相关文章:

ios - 如何在 Alamofire 中将原始数据作为参数发布?

ios - 在 Swift 中启动并将字符串传递给目标 View Controller

iphone - 在 iOS 6 中以编程方式获取通话记录

ios - 使应用程序出现在共享面板中以接受来自其他应用程序的选定文本

iphone - 如何使用UIWebView发送邮件?

swift - UISlider:触摸忽略轨道

ios - Swift URL resourceSpecifier 不可用

ios - 从 RAM swift 中删除 View

iphone - 如何构建一个iPhone应用程序,并确保该应用程序仅在未越狱的设备上运行?

ios - XCTest.框架/XCTest : no matching architecture in universal wrapper when run the app