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

时间:2015-01-18 08:51:10

标签: swift parse-platform delegates background-process

我有一个后台任务(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并发送结果?

2 个答案:

答案 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)

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

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