如何在后台获取tableview的数据?

How to get a tableview's data in the background?

我有一个后台任务 (usingParse.com API) 可以获取和计算表视图的数据:

 var usedMessages = [String]()
 var currentMessages = [Message]()

func getCurrentMessages() {

 if currentUser != nil {
  var entryQuery = Entry.query()
  entryQuery.whereKey("user", equalTo: currentUser)
  entryQuery.whereKey("originatedFromType", equalTo: "message")
  entryQuery.findObjectsInBackgroundWithBlock { (entryObjects: [AnyObject]!, getEntriesError: NSError!) -> Void in

   for object in entryObjects {
    var entry = object as Entry
    usedMessages.append(entry.originatedFromId)
   }

   var messageQuery = Message.query()
   messageQuery.whereKey("endDate", greaterThan:NSDate())
   messageQuery.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
    for object in objects {
     var message = object as Message
     if !contains(usedMessages, message.objectId) {
      currentMessages.append(message)
     }
    }
    self.tableview.reloadData()
   }
  }
 }
}

这是处理获取表视图数据然后重新加载表视图数据的正确方法吗?或者我应该使用一个委托来通知表视图数据已更改?或者甚至 query.findObjectInBackgroundWithTarget 并发送结果?

你的处理方式没有问题。但你必须确保那是你想要的行为。您基本上首先从 Entry 获取数据,然后在第一次调用完成时从 Message 获取结果。然后,您将在第二次调用完成时重新加载 table 视图。没有问题。

但是,您必须检查是否有返回的错误,如果您想要处理某些特定的错误,您可能想要处理它。

您应该始终确保 reloadData 和任何 UI 更新发生在主线程 中。还要检查该方法是否 return 出错。

messageQuery.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in

    if (error == nil)
    {
         //Your code.
        dispatch_async(dispatch_get_main_queue(),{ () -> Void in
            self.tableView.reloadData()
        })
    }
    else
    {
        // Log the error
    }
}