代码之家  ›  专栏  ›  技术社区  ›  Andy Lebowitz

需要在CloudKit查询后立即激活完成块

  •  0
  • Andy Lebowitz  · 技术社区  · 7 年前

    我一直在思考如何编写CloudKit完成块。我的问题是我正在加载数据,然后将数据放在tableView中。问题是我必须用一个按钮手动刷新tableView,而不是将数据自动加载到其中。我需要的是在查询结束时使用一个完成块来重新加载表数据。下面是我的查询功能:

    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中加载任何内容。有人能帮我写一个完成块来重新加载tableView吗?谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Andy Lebowitz    7 年前

    更新:

    我使用以下代码添加了补全:

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