arrays - 需要在 CloudKit 查询后立即触发完成 block

标签 arrays swift tableview cloudkit completionhandler

我被困在如何编写 CloudKit 完成 block 的想法上。我的问题是我正在加载数据,然后将数据放在 tableView 中。问题是我必须使用按钮手动刷新 tableView,而不是自动将数据加载到它。我需要的是在查询结束时有一个完成 block 来重新加载表数据。下面是我的查询函数:

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

        if record != nil{

            // setup screen after loading data

            self.recordToUpdate = record

            if creatingNewPost == true{
                print(feed)
                //create new post record (modify record)
                feed.append(postText)
                creatingNewPost = false
                self.saveNewPost()
            }

            self.publicOrPrivate = (record.object(forKey: "PublicOrPrivate") as! String)
            if self.publicOrPrivate == "Public"{
                // public
                //print("you have joined")

            }else if self.publicOrPrivate == "Private"{
                // private
                //print("requestSent")
                // self.sendRequest()
                 self.requests = (record.object(forKey: "Requests") as! Array)
            }
            if self.groupMembs.contains(username) || members.contains(username){
                self.joinBtn.alpha = 0
                // in group
            }else{
                self.joinBtn.alpha = 1
            }
            if self.leaders.contains(username) && self.publicOrPrivate == "Private"{
                // leader
                self.requestsTableView.alpha = 1
            }else{
                self.requestsTableView.alpha = 0
            }
            if self.groupMembs.contains(username) || self.publicOrPrivate == "Public"{
                // leader

                feed = (record.object(forKey: "groupFeed") as! Array)
                print(feed)
            }else{

            }
            self.groupMembs = (record.object(forKey: "memberUsernames") as! Array)

            print(self.groupMembs)
            self.numberOfMembersInGroup = self.groupMembs.count
            self.groupNameLbl.text = selectedCellName
            self.numberOfMembersLbl.text = "\(self.numberOfMembersInGroup) Members"
            self.leaders = (record.object(forKey: "leaders") as! Array)

            //****************************************************
            // this does nothing until I refresh it manually!
            self.requestsTableView.reloadData()
            self.groupFeedTableView.reloadData()
            //****************************************************
            //Need completion block so the above two lines will fire directly after data is done loading!
        }

    }
    database.add(operation)    
}

正如我在上面的代码中记录的那样,刷新那里的表格不会在实际 UI 中加载任何内容。有人可以写一个完成 block 来简单地为我重新加载 tableView 吗?谢谢!

最佳答案

更新:

我使用下面的代码来添加补全:

operation.queryCompletionBlock = { [unowned self] (cursor, error) in
        DispatchQueue.main.async {
            if error == nil {

                self.tableView.reloadData()

            }
        }
    }

像魅力一样工作!

关于arrays - 需要在 CloudKit 查询后立即触发完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47274834/

相关文章:

c - 为什么 *(ptr++) 不给出数组中的下一项?

ios - 每页仅包含 1 个 tableview 的滑动段控件

Javafx TableView 始终为空

iOS 10 语音套件 : Need help obtaining timestamp of each word during partial results

IOS:从不同 View 的类更改 View 的正确方法是什么?

ios - 在 custom-Cell TableView 中选择了哪个 TextField?

swift - UITableView 删除行

C# 相当于 VB 中的 { }.Contains()

javascript - 将 Javascript 数组元素拆分为指定索引处的 block

c++ - 如何在 C++ 中创建字符数组数组? (仅使用 iostream)