ios表视图行未显示

时间:2014-11-28 21:37:28

标签: ios nsurlsession

我使用xcode 6.0创建一个主 - 详细信息表视图,解析一个json文件后添加了行(在这种情况下使用DataManager),但是某些行不会立即显示。我必须滚动模拟器屏幕才能更新它。过了一会儿,我发现如果我在success回调逻辑中更新我的行,就会发生这个问题。这是表视图类和数据源逻辑:

class MasterViewController: UITableViewController {

    var objects = [AppModel]()

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        DataManager.getTopAppsDataFromFileWithSuccess { (data) -> Void in
        // I removed json parsing logic to highlight the issue
        self.objects.append(AppModel(id:1, name: "candy crush"]))
        self.insertRows()
    }

    func insertRows() {
        var index_path = NSIndexPath(forRow: 0, inSection: 0)
        self.tableView.insertRowsAtIndexPaths([index_path], withRowAnimation: .Automatic)
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return objects.count
    }

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

        let object = objects[indexPath.row]
        cell.textLabel.text = object.description
        return cell
    }

}

这是DataManager的代码:

class DataManager {

  class func getTopAppsDataFromFileWithSuccess(success: ((data: NSData) -> Void)) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
      let filePath = NSBundle.mainBundle().pathForResource("TopApps",ofType:"json")

      var readError:NSError?
      if let data = NSData(contentsOfFile:filePath!,
        options: NSDataReadingOptions.DataReadingUncached,
        error:&readError) {
        success(data: data)
      }
    })
  }
}

因此,如果我将self.objects.append()self.insertRows()移出DataManager.getTopAppsDataFromFileWithSuccess,那么事情就会完美无缺。我是否遗漏了处理此异步文件加载操作的内容?

1 个答案:

答案 0 :(得分:0)

这是一个异步操作。这意味着它可能发生在后台线程上,并且无法通过后台线程更新UI。只需将调度添加到成功块中的主线程即可。

  self.objects.append(AppModel(id:1, name: "candy crush"]))

  dispatch_async(dispatch_get_main_queue(), { () -> Void in
     self.insertRows()
  })