我有一个后台任务(usingParse.com API),用于获取和计算tableview的数据:
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()
}
}
}
}
这是处理获取tableview数据然后重新加载tableviews数据的正确方法吗?或者我应该使用委托通知tableview数据已更改?或者甚至可能是query.findObjectInBackgroundWithTarget并发送结果?
答案 0 :(得分:1)
您应该始终确保reloadData和任何 UI更新发生在主线程中。还要检查方法是否没有返回错误。
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
}
}
答案 1 :(得分:0)
您处理的方式没有问题。但你必须确保这是你想要的行为。您基本上首先从条目获取数据,然后在第一次调用完成后从消息获取结果。然后,您将在第二次调用完成后重新加载表视图。没有问题。
但是,你必须检查是否有错误返回,如果你想要处理某些错误,你可能想要处理它。