2017-01-27 2 views
0

Unten ist mein Code, der Bilder von Parse Server-Klasse abruft und laden Sie es in einer Tabellenansicht. Wenn ich GetAlbum UIbutton drücken, um die Daten anzuzeigen, muss ich es zweimal drücken, um erfolgreich Daten in der Tabellenansicht anzuzeigen, und ich kann nicht wissen, aus welchem ​​Grund. bitte helfen (PS: Ich bin zu schnellen)Swift, warum beim Abrufen von Daten aus Parse ich Taste zweimal drücken muss, um Daten in der Tabellenansicht zu laden

var Saveddata: [UIImage] = [] 

@IBAction func getAlbum(_ sender: AnyObject) { 
    if (self.textEntercode.text == "") 
    { 
     let alert = UIAlertController(title: "No Entered value", message: "Please enter value", preferredStyle: .alert) 
     alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)); 
     //event handler with closure 

     present(alert, animated: true, completion: nil); 
    } 
    else { 
     //-------------Get Data from Parse Server------------------- 
     var photo = textEntercode.text 
     let query = PFQuery(className: "Photostable10") 

     query.whereKey("photo", equalTo: photo) 
     //query.whereKey("Score", greaterThan: 1000) 

     query.findObjectsInBackground(block: { (objects : [PFObject]?, error: Error?) -> Void in 
      if error == nil { 
       for object in objects! { 
        if let userPicture = object.value(forKey: "photo") { 
         let userPicture = object.value(forKey: "photo")! as! PFFile 
         userPicture.getDataInBackground({ (imageData: Data?, error: Error?) -> Void in 
          let image = UIImage(data: imageData!) 
          if image != nil { 
           self.Saveddata.append(image!) 
          } 
         }) 
        } 
       } 
      } 
     }) 
     self.tableview.reloadData() 
    } //else close 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell")! 

    cell.textLabel!.text = "Post" 
    cell.imageView?.image = Saveddata[indexPath.row] 
    return cell 

} 

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

Antwort

1

Ihr Anruf zu self.tableView.reloadData() an der falschen Stelle ist und es von der falschen Warteschlange genannt wird. Sie müssen es in der Hauptwarteschlange aufrufen, und es muss innerhalb des Abfragevervollständigungshandlers aufgerufen werden, nachdem Sie das Datenmodell aktualisiert haben.

query.findObjectsInBackground(block: { (objects : [PFObject]?, error: Error?) -> Void in 
    if error == nil { 
     for object in objects! { 
      if let userPicture = object.value(forKey: "photo") { 
       let userPicture = object.value(forKey: "photo")! as! PFFile 
       userPicture.getDataInBackground({ (imageData: Data?, error: Error?) -> Void in 
        let image = UIImage(data: imageData!) 
        if image != nil { 
         self.Saveddata.append(image!) 
        } 
       }) 
      } 
     } 
     DispatchQueue.main.async { 
      self.tableview.reloadData() 
     } 
    } 
}) 
+0

Perfect - vielen Dank für Ihre Hilfe @rmaddy – rania

+0

Es tut mir leid es für eine Zeit gearbeitet, und ich habe dann wieder UIButton drücken zweimal Ich weiß nicht, warum - oder kann ich klickte zweimal ohne es zu merken – rania

+0

Verwenden Debugger und Schritt durch den Code. Bestätigen Sie, dass kein Fehler vorliegt, und bestätigen Sie, dass Sie die erwarteten Daten erhalten. – rmaddy

Verwandte Themen