2017-11-13 7 views
0

CloudKitコンプリートブロックを作成する方法について考えています。私の問題は、データを読み込んで、次にデータをtableViewに入れていることです。問題は、データを自動的にロードするのではなく、ボタンを使って手動でtableViewを更新する必要があることです。私が必要とするのは、テーブルデータをリロードするクエリの最後の完了ブロックです。以下は私のクエリ関数です:CloudKitクエリの直後にコンプリートブロックを起動する必要があります

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(s)を単にリロードする完了ブロックを書いてください。ありがとう!

+1

これは[あなたの前の質問](https://stackoverflow.com/questions/47254502/table-will-not-load-show-cloudkit-data)に私があなたに示したものに遠く離れていません)。 – rmaddy

+0

@rmaddyこれはまったく異なるクエリであるとは心配しないでください。私はもはやアレイの問題を持っていません。これで、テーブルをリロードするこのクエリの補完をどのように書くのですか(最後の問題に対する私の解決策は、オンラインでメモを辿るのが簡単でないため、完了を伴わなかった) –

+0

私の以前の質問に対する答えはあなたがここでやっているのとまったく同じこと。クエリの詳細は異なる場合がありますが、構造は同じです。 – rmaddy

答えて

1

UPDATE:魔法のように

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

       self.tableView.reloadData() 

      } 
     } 
    } 

作品:

私が完了したことを追加するには、次のコードを使用!

関連する問題