表将无法加载/显示CloudKit数据

时间:2017-11-12 22:01:16

标签: arrays swift uitableview cloudkit

我使用CloudKit存储一些数组,然后使用数组填充表格。我正在重新加载表,但它不会显示任何数据。它应该连接到iCloud,因为我仍然可以添加到数据库。

代码如下所示:

import UIKit
import CloudKit

var selectedCellName = ""

class explore: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet var tableView: UITableView!

    var groupNames = [String]()
    var Group = [CKRecord]()

    override func viewDidLoad() {
        super.viewDidLoad()

        loadGroups()
        self.tableView.reloadData()
    }

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

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: "exploreCell")! as UITableViewCell
        // let nameCell = leaderboardInfo[indexPath.row].object(forKey: "Name") as! String
        // let usernameCell = leaderboardInfo[indexPath.row].object(forKey: "Username") as! String
        //let pointsCell = leaderboardInfo[indexPath.row].object(forKey: "Points") as! String
        var nameCellLbl = cell.viewWithTag(100) as! UILabel

        nameCellLbl.text = groupNames[indexPath.row]

        return cell
    }
}

以下是loadGroups()函数,用于查询数据库:

 func loadGroups(){
    print("should go")
    // let pred = NSPredicate(format: "Username = %@", usernameText)
    let pred = NSPredicate(value: true)
    let query = CKQuery(recordType: "Group", predicate: pred)
    let operation = CKQueryOperation(query: query)
    //operation.resultsLimit = CKQueryOperationMaximumResults
    operation.qualityOfService = .default
    operation.recordFetchedBlock = { (record: CKRecord!) in

        if record != nil{

            // need self in front?
            groupNames.append(record.object(forKey: "groupName") as! String)


            //self.tableView.reloadData()
            //print(self.groupNames.count)

        }


      }
    database.add(operation)
    //self.tableView.reloadData()
    // print(leaderboardInfo.count)
}

这曾经起作用,如果我做了改变,我几个月前做了,所以我不记得了。无论如何,这是我查询数据库的所有文件中的问题,但表格不会加载它。

1 个答案:

答案 0 :(得分:1)

在实际查询数据之前,您正在重新加载表视图。

移除reloadData中对viewDidLoad的号召。

loadGroups中,您需要设置查询完成处理程序。您需要处理查询完成处理程序指示有更多数据需要加载的可能性。

您应该从查询的数据构建一个新数组。在拥有所有数据之前,请勿更新groupNames。然后,在主队列上,使用查询结果更新groupNames,然后重新加载表视图。

更好的解决方案是在loadGroups方法中添加完成处理程序。然后,而不是loadGroups直接更新groupNames并重新加载表视图,它只是传回一个包含所有查询数据的新数组。然后调用者可以更新groupNames并重新加载表视图,将其传递给调用loadGroups的完成块。

func loadGroups(completion: ((_ groups: [String]) -> Void)) {
    var names = [String]()

    // setup operation
    ...
    operation.recordFetchedBlock = { (record: CKRecord!) in
        if record != nil {
            names.append(record.object(forKey: "groupName") as! String)
        }
    }

    operation.queryCompletionBlock = { (cursor, error) in {
        // properly handle cursor and error

        completion(names)
    }
}

然后可以从您的视图控制器调用它:

loadGroups() { (names) in
    DispatchQueue.main.async {
        groupNames = names
        tableView.reloadData()
    }
}

以上是粗略的概述。这并不意味着生产就绪。