2016-08-07 37 views
1

Ich hoffe, jemand kann helfen, weil dies wahrscheinlich ein einfaches Problem ist, aber meine Parse Abfrage innerhalb einer Abfrage druckt das Objekt, das ich suche, kann aber nicht an das Array ich brauche es anhängen um es in einem UITableView abzurufen.Abfrage in Abfrage nicht anfügen mit Swift/Parse

Der Fehler ist "schwerwiegender Fehler: Index außerhalb des Bereichs", wenn ich die Ergebnisse der Abfrage in einer Zelle aus der Warteschlange nehme.

Hier ist der Code:

Import UIKit Import Parse Import Bolts

Klasse MessagesTableVC: UITableViewController {

var usernames = [String]() 
var sentDate = [NSDate]() 
var details = [String]() 
var userImage = [PFFile]() 


@IBAction func backToProfile(sender: AnyObject) { 
    self.performSegueWithIdentifier("messagesToProfile", sender: self) 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    let messagesQuery = PFQuery(className: "Messages") 
    messagesQuery.whereKey("recipientId", equalTo: PFUser.currentUser()!.objectId!) 
    messagesQuery.includeKey("senderId") 
    messagesQuery.orderByDescending("createdAt") 
    messagesQuery.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 

     if error != nil { 
      print(error) 
     } 

     if error == nil { 

      if let objects = objects { 

       self.usernames.removeAll(keepCapacity: true) 
       self.sentDate.removeAll(keepCapacity: true) 
       self.details.removeAll(keepCapacity: true) 
       self.userImage.removeAll(keepCapacity: true) 

       for object in objects { 

        self.sentDate.append(object.createdAt! as NSDate) 

        if (object["item"] != nil) { 
        self.details.append(object["item"] as! String) 
        } else { 
        self.details.append(object["request"] as! String) 
        } 

        let senderObject = (object["senderId"] as! PFUser) 
        let senderId = (senderObject.objectId! as String) 

        print(senderId) 

        // Query for sender info 
        let userQuery = PFUser.query() 
        userQuery?.whereKey("objectId", equalTo: senderId) 
        userQuery?.getFirstObjectInBackgroundWithBlock({ (object, error) in 

         self.usernames.append((object!["username"] as! String)) 

         //self.userImage.append(object!["profilePicture"] as! PFFile) 

        }) 




       } 

       dispatch_async(dispatch_get_main_queue()) { 
        self.tableView.reloadData() 
        //self.search.resignFirstResponder() 
       } 
      } 


    } 
    }) 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return sentDate.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("messageCell", forIndexPath: indexPath) as! MessageTableViewCell 

    //print(usernames[indexPath.row]) 
    cell.senderUsername.text = usernames[indexPath.row] 
    cell.itemOrPreview.text = details[indexPath.row] 

    let date = sentDate[indexPath.row] 
    let formatter = NSDateFormatter() 
    formatter.dateStyle = NSDateFormatterStyle.LongStyle 
    formatter.timeStyle = .ShortStyle 
    let dateString = formatter.stringFromDate(date) 
    cell.sentDate.text = dateString 


    //userImage[indexPath.row].getDataInBackgroundWithBlock { (data, error) in 
     // if let downloadedItemImage = UIImage(data: data!) { 
     // cell.senderImage?.image = downloadedItemImage 
     //} 
    //} 


    return cell 
} 

override func viewWillAppear(animated: Bool) { 
    tableView.reloadData() 
} 

}

+2

Sie können nicht mit Online-Datenbank die gleichen wie lokale Variablen ... Aufruf Funktion 'findObjectsInBackgroundWithBlock' und innerhalb davon für jedes zurückgegebene Objekt tun' getFirstObjectInBackgroundWithBlock' ist das ärmste Design aller Zeiten !! Netzwerk-Anfrage aint billig !! ... für den Fehler, den Sie bekommen, würde ich google was '.removeAll (keepCapacity: true)' wirklich tut ... –

+0

Hey Mazel Tov- danke für Ihre Antwort. Wie würdest du es machen? – jwhubert91

Antwort

1

Wie ich denke kann, könnte man inkonsequent bekommen Anzahl der Elemente in sentDate und usernames weil Sie Anfügen an usernames über asynchrone getFirstObjectInBackgroundWithBlock Methode, also, wenn Sie reloadData auf TableView aufrufen, werden möglicherweise noch keine Benutzernamen zu usernames hinzugefügt. Möglicherweise haben Sie weniger Elemente in usernames dann in sentDate zu dem Zeitpunkt, zu dem Ihr TableView-Rückruf ausgelöst wird, und in NumberOfItems geben Sie die Anzahl der Elemente in sentDate zurück.

Um das zu beheben, müssen Sie zuerst Ihren Code umgestalten, es hat viele Orte, an denen Dinge schief gehen könnten. Ich werde keine spezifischen Ratschläge geben, aber anscheinend sollten Sie warten, bevor Sie alle Daten erhalten, bevor Sie Ihr TableView neu laden.