在主线程上链接UITableview更新

时间:2015-10-12 19:48:09

标签: ios multithreading swift uitableview

所以我试图做的事情在概念上非常简单,但是我找不到它的解决方案:

我正在尝试从使用:

动画的tableView中删除单元格
self.coolTableView?.deleteRowsAtIndexPaths

函数,要做到这一点,我更改了dataSet并执行此操作,完成后我想再次更改数据集并使用:

self.coolTableView?.insertRowsAtIndexPaths

反映数据集的第二个更改并为其设置动画。 我遇到的问题是,如果我使用:

dispatch_async(dispatch_get_main_queue()) { () -> Void in
//Update tableview
}
他们似乎互相锁定,使用过的内存只是一直在暴涨而且它会挂起。我假设他们互相干扰。现在我的下一个想法是将代码更改为同步所以:

dispatch_sync(dispatch_get_main_queue()) { () -> Void in
//Update tableview
}

然而,第一次更新挂起并停止操作。通过我所做的研究,听起来我正在将块的执行放在当前正在运行的应用程序和vuwala后面的主队列中,这就是它挂起的原因。

阻止执行的正确方法是什么,直到我可以在主线程上完成动画,这样我就不会在动画发生之前炸掉我的数据源?

1 个答案:

答案 0 :(得分:1)

iOS中的动画会占用动画终止时可以执行的块。尝试将关于coolTableView的操作放入一个闭包中(记住无主的self以不创建内存泄漏)并将其作为完成闭包传递给动画。

示例:

let someAnimations: () -> Void = {
  //some animations
}

let manipulateTableView: (Bool) -> Void = {
  isAnimationFinished in
  // perform some data manipulation
}

UIView.animateWithDuration(0.5, animations: someAnimations, completion:  manipulateTableView)