数组使用Parse返回PFQuery外部的空数组

时间:2017-04-05 03:00:52

标签: arrays swift parse-platform tableview pfquery

我正在尝试填充数组postCaptions。 我需要将此数组返回到numberOfRowsInSection以获取我的表视图,但每次都返回一个空数组。

//                                 ▼ selecting the toBeTested element
update({_id: req.params.parentid, 'toBeTested.thingsTested': 'A3'}, 
//                          ▼ referencing the selected element
       {$pull: {'toBeTested.$.thingsTested': 'A3'}}});

我知道问题在于线程的顺序,我理解这一点,但我不确定我能做些什么来使数组在查询之外保持填充。我已经看到这是解决这个问题的方法,但我真的没有找到一个直截了当的答案,我可以在我的代码中解决这个问题。如果有人能提供适合我的代码的答案,这将是惊人的!:)我已经坚持这个问题超过一个星期了

  var postCaptions = [String]()

  query2.whereKey("userid", equalTo: PFUser.current()?.objectId!)                        
  query2.findObjectsInBackground(block: { (objects, error) in   
        if let userPosted = objects {       
           for object in userPosted {         
               if let userPost = object as? PFObject {        
                  self.postImageFiles.append(userPost["userPostImage"] as! PFFile)                                      
                  self.postLocation.append(userPost["userPostLocation"] as! String)
                  self.postCaptions.append(userPost["postCaption"] as! String)
                  print(self.postCaptions.count) //returns value of 2 for the two posts that I've made                
                  self.tableView.reloadData()            
                  self.refresher.endRefreshing()
               }
            }
         }

   })          
   print(self.postCaptions.count) //Returns empty array

** cellForRowAt

 var postCaptions = [String]() {
didSet {
    // Do any execution that needs to wait for postCaptions here.
}
 }

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,那就相当简单了。将var postCaptions = [String]()设置为所需类中的全局变量。然后按照您的方式将迭代中的值附加到它。然后可以在代码的其他部分访问postCaptions值,您可以使用count属性。

答案 1 :(得分:0)

由于方法findObjectsInBackground表明它是在后台执行的,这意味着它与您的UI无关,因此在此函数完成之前,您的数组将保持为空。在您打印该数组时,此功能尚未完成,因此postCaptions现在将为空。

这就是为什么numberOfRows将为零。

我认为您需要做的是将此查询放入viewDidLoad或您指定的初始化程序,然后像完成程序段中那样调用tableView.reloadData()。此外,您可能希望声明Bool,以确定表是否正在加载,并且在完成块中,在成功执行查询后将isLoading设置为false。

query2.findObjectsInBackground(block: { (objects, error) in

    if let userPosted = objects {
        self.isLoading = false

        for object in userPosted {

            if let userPost = object as? PFObject {

                self.postImageFiles.append(userPost["userPostImage"] as! PFFile)

                self.postLocation.append(userPost["userPostLocation"] as! String)

                self.postCaptions.append(userPost["postCaption"] as! String)

                print(self.postCaptions.count) //returns value of 2 for the two posts that I've made

             }

         }

         self.tableView.reloadData()

         self.refresher.endRefreshing()

     }

 })

并在numberOfRowsInSection内:

if isLoading { //you need to declare isLoading 
    return 1 //maybe a dummy cell to tell user the table is loading
} else {
    return postCaptions.count
}