簡體   English   中英

加載TableData之前如何從CloudKit獲取數據

[英]How to get data from CloudKit before loading TableData

我正在Swift中編寫一個應用程序,其中第一個場景具有TableView,我將其設置為顯示標題並且工作正常,我也將其設置為計算CloudKit數據庫(或其任何名稱)中的出現次數,但是它執行異步計數,因此該表默認在詳細信息窗格中顯示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
}

非常感謝-Robbie

performQuery關聯的關閉將異步完成-即viewDidLoad完成之后。 您需要確保在查詢完成並擁有數據后重新加載表格視圖。 您還遇到了一個問題,因為您要在閉包之外更新總計-此代碼還將在加載數據之前執行。

最后,確保對UI的所有更新(例如重新加載表視圖)都已分派到主隊列中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM