为什么在后台线程上调用tableView:cellForRowAtIndexPath:

时间:2013-07-05 16:13:33

标签: iphone ios uitableview nsthread

在我的iPhone应用程序中,我偶尔会看到由tableView引起的崩溃:cellForRowAtIndexPath:在后台线程上调用。

显然,这不应该发生。我没有调用它,我的对象是UITableView的委托,基础是调用它 - 我在堆栈中看到的唯一的问题是

-_WebTryThreadLock(bool)
-_dequeuReusableViewOfType
-tableView:cellForRowAtIndexPath:
-_createPreparedCellForGlobalRow:withIndexPath
-_pthread_qathread

崩溃发生在WebTryThreadLock中 - 毫不奇怪,它不是线程安全的,不应该从主线程调用。

但是我怎么弄清楚为什么我的tableView委托在后台线程上被调用?

我想知道 - 如果我在后台线程上调用[tableView reloadData],会这样做吗?

我一直以为它只会在主线程上调度调用。我不确定我是否正在这样做,但我可能会,并且我会检查,但实际上,不应该检查UIKit并在主线程上调用委托方法吗?

2 个答案:

答案 0 :(得分:3)

您无法在辅助线程上调用[tableView reloadData]。你不能在辅助线程上调用任何UIKit东西(有一些例外,例如UIImage)。这包括所有tableView方法,包括直接getter和setter。无论渲染是否相关都无关紧要。

答案 1 :(得分:2)

在视图控制器周围撒一些这些可能很有趣:

if(![NSThread isMainThread]){     的NSLog(@ “咦?”); }

我很确定UIKit / IOS不会自己决定在后台线程上调用表视图委托方法。你有dispatch_async,detachNewThreadSelector,performSelectorInBackground吗?