在UITableViewCell中更新UILabel时出现延迟

时间:2014-02-18 17:11:46

标签: objective-c uitableview uilabel delay

背景

我有一个自定义UITableViewCell子类(AlbumCell),后者又有两个子类(Type1AlbumCell and Type2AlbumCell)。 AlbumCell仅作为抽象类,而后两者在故事板中的UITableViewController中作为原型单元格排列。 AlbumCell声明了两个IBOutletslikeCountLabelshortTitleLabel,每个子类通过其布局连接两个作为故事板中的原型单元格。

问题:

更新Type2AlbumCell中任一标签的文字时会有延迟,而Type1AlbumCell会在设置值后立即更新。 这不是主线程被挂起的结果,因为您可以在等待文本更新时滚动并执行其他操作。它只需要4-5秒左右。以前有没有经历过这样的事情?感谢。

请记住,文本是从单元格子类中设置的,而不是从表视图控制器中设置的。当我们尝试在当前正在查看单元格时更新标签文本时,而不是在cellForRowAtIndexPath中设置新单元格时,会出现此问题。在单元子类中点击一个按钮,导致文本发生变化。

1 个答案:

答案 0 :(得分:-1)

问题是我正在从后台线程上运行的完成块调用UIKit。最初,我已将此问题排除在原因之外,因为完成块中的另一段代码被立即调用。我没有意识到从后台线程调用UIKit会导致不稳定的行为,因为UIKit不是线程安全的。

幸运的是,我仍然可以从完成块调用UIKit,只要我确保代码在主线程上运行即可。我使用我在另一个Stack Overflow问题中找到的以下代码执行此操作:

- (void)runBlockOnMainQueueWithoutDeadlocking:(void (^)(void))block {
if ([NSThread isMainThread]) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}}

此方法允许您传递要在主线程上执行的代码块,如果您已经在主线程上运行,则不会使主线程死锁。这大部分时间都有效,但显然有一些边缘情况。

您也可以使用performSelectorOnMainThread: