3

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

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

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

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

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

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

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

4

2 回答 2

3

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

于 2013-07-05T16:34:26.297 回答
2

在您的视图控制器周围散布其中一些可能会很有趣:

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

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

于 2013-07-05T17:48:16.527 回答