2017-11-12 8 views
0

CloudKitを使用していくつかの配列を格納し、配列を使用してテーブルを埋めます。私はテーブルをリロードしていますが、データは表示されません。私はまだデータベースに追加できるので、iCloudに接続する必要があります。テーブルはCloudKitデータをロード/表示しません

コードを以下に示します。ここでは

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

実際にデータを照会するよりもずっと前に、テーブルビューをリロードしています。

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

。これは生産準備ができているわけではありません。

+0

テーブルをリロードするだけの簡単な更新ボタンを追加しました。私はそれが動作するはずだと思うが、それは私が1分待った後でさえも –

+0

問題はそのgroupNamesが空である可能性があります...私はそこに自己があるかもしれないと言うloadGroups()関数で参照してください追加文?関数が別のファイルにあるときにどのように追加するのですか? –

+0

'loadGroups'が別のクラスにあっても、より良い解決策を得るための私の更新された答えを見てください。 – rmaddy

関連する問題