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



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

显然,这种情况不应该发生。我没有调用它,我的对象是UITableView的委托,基金会正在调用它——我在堆栈中看到的唯一一个线程是

-_WebTryThreadLock(布尔)-_dequeuReusableViewOfType-表视图:cellForRowAtIndexPath:-_createPreparedCellForGlobalRow:withIndexPath-_pthread_qathread

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

但是,我如何弄清楚为什么我的tableView代理在后台线程上被调用?

我想知道,如果我在后台线程上调用[tableView reloadData],那能做到吗?

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

您不能在辅助线程上调用[tableView reloadData]。您不能在辅助线程上调用任何UIKit内容(除了一些例外,例如UIImage)。这包括所有tableView方法,包括直接getter和setter。它是否与渲染相关并不重要。

在您的视图控制器周围添加一些内容可能会很有趣:

if(![NSThread isMainThread]){NSLog(@"啊?");}

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

最新更新