在我的iPhone应用程序中,我偶尔会看到由tableView引起的崩溃:cellForRowAtIndexPath:在后台线程上调用。
显然,这不应该发生。我没有调用它,我的对象是UITableView的委托,基础是调用它 - 我在堆栈中看到的唯一的问题是
-_WebTryThreadLock(bool) -_dequeuReusableViewOfType -tableView:cellForRowAtIndexPath: -_createPreparedCellForGlobalRow:withIndexPath -_pthread_qathread
崩溃发生在WebTryThreadLock中 - 毫不奇怪,它不是线程安全的,不应该从主线程调用。
但是我怎么弄清楚为什么我的tableView委托在后台线程上被调用?
我想知道 - 如果我在后台线程上调用[tableView reloadData],会这样做吗?
我一直以为它只会在主线程上调度调用。我不确定我是否正在这样做,但我可能会,并且我会检查,但实际上,不应该检查UIKit并在主线程上调用委托方法吗?
答案 0 :(得分:3)
您无法在辅助线程上调用[tableView reloadData]
。你不能在辅助线程上调用任何UIKit东西(有一些例外,例如UIImage
)。这包括所有tableView方法,包括直接getter和setter。无论渲染是否相关都无关紧要。
答案 1 :(得分:2)
在视图控制器周围撒一些这些可能很有趣:
if(![NSThread isMainThread]){ 的NSLog(@ “咦?”); }
我很确定UIKit / IOS不会自己决定在后台线程上调用表视图委托方法。你有dispatch_async,detachNewThreadSelector,performSelectorInBackground吗?