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 メソッドが含まれます。レンダリング関連かどうかは関係ありません。

于 2013-07-05T16:34:26.297 に答える