4

私はiOSアプリケーションでトップクラッシュの1つを引き起こしている原因を突き止めようとしています。バックグラウンドスレッドで何らかのレイアウトが発生しているため、クラッシュが発生しているようです。このリレーアウトをトリガーしている私が何をしているのかを判断する方法はありますか?スタックから、アプリがフォアグラウンドに戻されているときにUIWebViewに関連していると推測します。

このトピックに関する他のstackoverflowスレッドは、バックグラウンドスレッドでテーブルのリロードをトリガーするなどのことを言及しているようです。私が見る限り、すべてのwebViewデリゲートメソッドがメインスレッドで呼び出されます。これが当てはまらない場合や、バックグラウンドスレッドで呼び出される他のメソッドがあり、私が気付いていない場合がありますか?

Webスレッド-クラッシュしました。

0    WebCore _WebTryThreadLock(bool) + 297
1    WebCore _WebTryThreadLock(bool) + 288
2    WebCore WebThreadLock + 66
3    UIKit -[UIWebDocumentView(UIWebDocumentViewTextSelecting) selectionBaseWritingDirection] + 10
4    UIKit -[UITextField _currentTextAlignment] + 86
5    UIKit -[UITextField _showsClearButtonWhenNonEmpty:] + 58
6    UIKit -[UITextField _textRectForBounds:forEditing:] + 678
7    UIKit -[UITextField editingRectForBounds:] + 52
8    UIKit -[UITextField editRect] + 70
9    UIKit -[UITextField layoutSubviews] + 1320
10   UIKit -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 258
11   QuartzCore -[CALayer layoutSublayers] + 214
12   QuartzCore CA::Layer::layout_if_needed(CA::Transaction*) + 460
13   QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
14   QuartzCore CA::Context::commit_transaction(CA::Transaction*) + 238
15   QuartzCore CA::Transaction::commit() + 316
16   QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60
17   CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
18   CoreFoundation __CFRunLoopDoObservers + 276
19   CoreFoundation CFRunLoopRunSpecific + 394
20   CoreFoundation CFRunLoopRunInMode + 104
21   WebCore RunWebThread(void*) + 444
22   libsystem_c.dylib pthread_start + 308

メイン-スレッド

0    libsystem_kernel.dylib __psynch_mutexwait + 24
1    libsystem_c.dylib pthread_mutex_lock + 392
2    WebCore _WebTryThreadLock(bool) + 336
3    WebCore WebThreadLock + 66
4    WebKit -[WebDatabasePauser applicationWillEnterForeground] + 16
5    CoreFoundation _CFXNotificationPost + 1426
6    Foundation -[NSNotificationCenter postNotificationName:object:userInfo:] + 72
7    UIKit -[UIApplication _sendWillEnterForegroundCallbacks] + 154
8    UIKit -[UIApplication _handleApplicationResumeEvent:] + 1094
9    UIKit -[UIApplication handleEvent:withNewEvent:] + 1292
10   UIKit -[UIApplication sendEvent:] + 72
11   UIKit _UIApplicationHandleEvent + 6154
12   GraphicsServices _PurpleEventCallback + 590
13   CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
14   CoreFoundation __CFRunLoopDoSources0 + 212
15   CoreFoundation __CFRunLoopRun + 646
16   CoreFoundation CFRunLoopRunSpecific + 356
17   CoreFoundation CFRunLoopRunInMode + 104
18   GraphicsServices GSEventRunModal + 74
19   UIKit UIApplicationMain + 1120
20   AppName main.m line 23
4

1 に答える 1

0

バックグラウンド スレッドで UI を更新しているようです。コードで、UI を更新していて、バックグラウンド スレッドでデータを取得している場所に次の行を追加します。

dispatch_async(dispatch_get_main_queue(), ^{
                    // Update data here
});

すぐに、むしろコードがデータがデバイス上にあると感じ、新しいデータに対応する UI を更新してから、メイン スレッドを動作状態に戻します。

それが役に立てば幸い。

于 2013-02-13T20:51:15.380 に答える