我使用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
,那么事情就会完美无缺。我是否遗漏了处理此异步文件加载操作的内容?
答案 0 :(得分:0)
这是一个异步操作。这意味着它可能发生在后台线程上,并且无法通过后台线程更新UI。只需将调度添加到成功块中的主线程即可。
self.objects.append(AppModel(id:1, name: "candy crush"]))
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.insertRows()
})