2017-10-07 1 views
0

Ich erhalte den Fehler "Index außerhalb des Bereichs", wenn ich meine Tabellenansicht neu lade. Wenn ich tableView.ReloadData auskommentiere und die Array-Anzahl ausdrücke, wird ein vollständiges Array angezeigt. Wenn ich es jedoch in der Haupt-Dispatch-Warteschlange habe, wird ein leeres Array gedruckt und ein Fehler verursacht. HiertableView.ReloadData löscht Array - Index außerhalb des Bereichs

 func loadData() { 


       posts = [CKRecord]() 
       print("loading") 


       var predicate : NSPredicate! 
       predicate = NSPredicate(format: "TRUEPREDICATE", argumentArray: nil) 
       let publicData = CKContainer.default().publicCloudDatabase 
       let queryPic = CKQuery(recordType: "Main", predicate: predicate) 
       publicData.perform(queryPic, inZoneWith: nil) { (results:[CKRecord]?, error:Error?) -> Void in 

        print(results?.count as Any) 
      //prints full array here 


        if let Pics = results { 
         self.posts = Pics 
         DispatchQueue.main.sync{ 
          //Commenting out below prints a full array 
          self.tableView.reloadData() 



          self.refresh.endRefreshing() 

          print(results?.count as Any) 
     // full array also prints here when reloadData is removed. 
          print("refreshed pics") 

         } 
        } 
        } 


       } 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 


     let varCount = posts.count as Int 
     print(varCount) 

     let post = posts[indexPath.row] 

     let cellPic = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! StreamTableViewCell 

     if let postContent = post["content"] as? String { 
      let postImage = post["picture"] as? CKAsset 
      let data = try? Data(contentsOf: (postImage?.fileURL)!) 
      let name = post["UserID"] as? String 
      let vote = post["voteInteger"] as! Int 

      cellPic.layer.cornerRadius = 8.0 
      cellPic.layer.masksToBounds = true 
      cellPic.delegate = self 

      cellPic.streamImageView.image = UIImage(data: data!) 

      cellPic.nameLabel.text = name 

      cellPic.contentLabel.text = postContent 

     cellPic.voteInteger.text = String(describing: vote) 

     cellPic.voteOld = vote 

     cellPic.recordName = post.recordID.recordName 

     } 

     return cellPic 

ist der Debugger readout-

loading 
Optional(3) 
Optional(3) 
refreshed pics 
3 
3 
loading 
0 
fatal error: Index out of range 
2017-10-07 17:51:36.345951-0400 PondrMatchv.2[2910:357829] fatal error: 
Index out of range 

Wie Sie sehen können, lädt es in Ordnung, wenn die Anwendung gestartet wird, das Array enthält 3 Datensätze, und ändert sich nicht, wenn neu geladen.

Wenn ich nur einen Datensatz im Array habe, wird es völlig neu geladen. Ich habe vor kurzem Cloudkit-Containernamen geändert, aber selbst wenn ich zum alten Container zurückwechsle, stürzt es ab. Dies geschieht auch im Produktionscontainer.

Update: Hier ist die Anzahl der Zeilen in Abschnitt Funktion.

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

Auch nach Bruchstellen und erneuten Bestätigung mit der Debugger Anzeige hinzufügen, scheint es über die gesamte Vermittlungsrufprozessor Skipping wird beim Nachladen, und ging direkt auf die Tableview cellForRowAt Funktion, weshalb ich nicht zwei bekommen Sie Optional(3) Drucke.

+0

Verschieben Sie die Zeile 'self.posts = Pics' in den Aufruf von' DispatchQueue.main.sync'. Und ändern Sie "main.sync" in "main.async". – rmaddy

+0

guten Haken auf dem Async, nie bemerkt, dass. Stürzt immer noch mit dem gleichen Fehler ab, obwohl @rmaddy –

+0

Haben Sie die Zeile 'self.posts = Pics' verschoben? – rmaddy

Antwort

0

Das Problem wurde durch Ändern des Prädikats behoben. Nicht sicher, ob es einen Bug mit dem schnellen Update oder was ist.

Verwandte Themen