2017-07-11 3 views
0

Ich versuche eine Verbindung zwischen "Benutzer" und "Kommentare" auf mongoDB zu erstellen, um Kommentare zu meiner App zu erhalten.Verbindung mit mongoDB und Parse in Swift

Dies ist mein Code:

let query = PFQuery(className: "comments") 
    query.whereKey("to", equalTo: commentuuid.last!) 
    query.skip = count - self.page 
    query.addAscendingOrder("createdAt") 
    query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in 

     if error == nil { 
      // Clean up 
      self.usernameArray.removeAll(keepingCapacity: false) 
      self.avaArray.removeAll(keepingCapacity: false) 
      self.commentArray.removeAll(keepingCapacity: false) 
      self.dateArray.removeAll(keepingCapacity: false) 

      // find related objects 
      for object in objects! { 

       let infoQuery = PFQuery(className: "_User") 
       infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block: { (test: PFObject?, error: Error?) in 
       if error == nil { 
        print("YES") 
        self.usernameArray.append(test!.object(forKey: "username") as! String) 

       } else { 
        print(error!.localizedDescription) 
       } 
       }) 

       self.commentArray.append(object.object(forKey: "comment") as! String) 
       self.dateArray.append(object.createdAt) 
       self.tableView.reloadData() 

       // Scroll to bottom 
       self.tableView.scrollToRow(at: IndexPath(row: self.commentArray.count - 1, section: 0), at: .bottom, animated: true) 
      } 

     } else { 
      print(error!.localizedDescription) 
     } 


    }) 

Diese Linien gut ausgeführt werden:

self.commentArray.append(object.object(forKey: "comment") as! String) 
       self.dateArray.append(object.createdAt) 

Aber das eine nicht:

let infoQuery = PFQuery(className: "_User") 
       infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block: { (test: PFObject?, error: Error?) in 
       if error == nil { 
        print("YES") 
        self.usernameArray.append(test!.object(forKey: "username") as! String) 

       } else { 
        print(error!.localizedDescription) 
       } 
       }) 

Ich versuchte, die usernameArray und dateArray zu drucken (nur um den Unterschied zu sehen) in der CellForRowAt-Funktion.

Wenn ich die Ansicht starte, ist benutzernameArray leer und dateArray ist nicht. Wenn ich ein wenig scrolle, ist der BenutzernameArray gefüllt (aber ich muss scrollen, um das Array zu füllen, was nicht akzeptabel ist).

Antwort

0

Könnte sein, weil Sie UI verwandte Methoden aufrufen, bevor die Daten abgerufen wurden:

  self.commentArray.append(object.object(forKey: "comment") as! String) 
      self.dateArray.append(object.createdAt) 

      let infoQuery = PFUser.query()! 
      infoQuery.getObjectInBackground(withId: object.object(forKey: "id") as! String, block: { (test: PFObject?, error: Error?) in 
      if error == nil { 
       print("YES") 
       self.usernameArray.append(test!.object(forKey: "username") as! String) 

      } else { 
       print(error!.localizedDescription) 
      } 

       // These two methods were the issue. 
       self.tableView.reloadData() 
       // Scroll to bottom 
       self.tableView.scrollToRow(at: IndexPath(row: self.commentArray.count - 1, section: 0), at: .bottom, animated: true) 

      }) 



Sie berücksichtigen sollten:

  • Mit Sub-Klassierung PFObject zu vermeiden Zugriff auf das Rohwörterbuch, was zu Tippfehlern führen kann.
  • Ersetzen das Stichwort object mit einem besseren (je nach Kontext, comment)