Frage

Wir sind ein Crash-Protokoll von iTunes Empfang verbindet, dass ein wenig seltsam.

Wir hatten preivously Probleme mit unserer App zu lange dauern würde, von ApplicationDidFinishLaunching zurückzukehren. Dies wurde verursacht durch eine zu viel Arbeit innerhalb von applicationDidFinishLaunching tun und wir überschritten die 20 Sekunden Zeit auf langsamere Geräte.

Um dies zu beheben wir alle unsere Setup-Code aus ApplicationDidFinishLaunching bewegt und bewegt sie in einen speziellen secondaryLoadingController. Obendrein zogen wir die Setup-Code innerhalb dieser Steuereinheit an einen separaten Thread.

Wir sind jedoch immer noch sehen Crash-Protokolle, die unsere App zu starten in der Zeit gescheitert sagen, auch wenn das Crash-Protokoll zeigt einen Aufruf an [UIApplication _reportAppLaunchFinished]. Für mich bedeutet dies, dass der App fertig Start hat und wir sollten so lange frei zu nehmen, wie wir unseren Setup-Code ausgeführt werden sollen. Unten ist das Crash-Protokoll.

Vielen Dank für jede Hilfe können Sie anbieten.

Incident Identifier: 429360D5-6B02-49BE-9A0F-164DC521BE36
Hardware Model:      iPod2,1
Process:         XYZ [357]
Path:            /var/mobile/Applications/D5038F26-CC5B-48E5-824E-090163B5C0C4/XYZ.app/XYZ
Identifier:      XYZ
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]



Date/Time:       2010-09-28 13:35:25.138 -0700
OS Version:      iPhone OS 4.0 (8A293)
Report Version:  104



Exception Type:  00000020
Exception Codes: 0x8badf00d
Highlighted Thread:  0



Application Specific Information:
com.xyz.xyz failed to launch in time
elapsed total CPU time (seconds): 20.180 (user 15.910, system 4.270), 100% CPU
elapsed application CPU time (seconds): 10.960, 54% CPU



Thread 0:
0   libobjc.A.dylib                   0x3523a50c objc_msgSend + 44
1   CoreFoundation                    0x363bf568 -[__NSArrayM addObject:]
2   XYZ                        0x0000a152 -[Database fetchDrinks:] + 290
3   XYZ                        0x0000677c -[Database getAllDrinks] + 136
4   XYZ                        0x0003a164 -[SecondaryLoadingViewController viewDidLoad] + 208
5   UIKit                             0x323e582c -[UIViewController view]
6   UIKit                             0x323f9628 -[UIViewController viewControllerForRotation]
7   UIKit                             0x323f9574 -[UIViewController _visibleView]
8   UIKit                             0x323f94fc -[UIViewController rotatingContentViewForWindow:]
9   UIKit                             0x3249a514 -[UIClientRotationContext initWithClient:toOrientation:duration:andWindow:]
10  UIKit                             0x32499314 -[UIWindow _setRotatableClient:toOrientation:duration:force:]
11  UIKit                             0x32497d78 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:]
12  UIKit                             0x32497534 -[UIViewController presentModalViewController:withTransition:]
13  UIKit                             0x324977fc -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:]
14  UIKit                             0x324977c0 -[UIViewController _tryRecursivelyPresentModalViewController:withTransition:]
15  UIKit                             0x32496e00 -[UIViewController presentModalViewController:withTransition:]
16  UIKit                             0x3249699c -[UIViewController presentModalViewController:animated:]
17  XYZ                        0x000044a2 -[HomeViewController viewDidLoad] + 82
18  UIKit                             0x323e582c -[UIViewController view]
19  UIKit                             0x323fd68c -[UIViewController contentScrollView]
20  UIKit                             0x323fd4ac -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:]
21  UIKit                             0x323fd358 -[UINavigationController _layoutViewController:]
22  UIKit                             0x323fccb8 -[UINavigationController _startTransition:fromViewController:toViewController:]
23  UIKit                             0x323fca1c -[UINavigationController _startDeferredTransitionIfNeeded]
24  UIKit                             0x323fc90c -[UINavigationController viewWillLayoutSubviews]
25  UIKit                             0x323fc43c -[UILayoutContainerView layoutSubviews]
26  UIKit                             0x32370ab0 -[UIView(CALayerDelegate) _layoutSublayersOfLayer:]
27  CoreFoundation                    0x363c85ba -[NSObject(NSObject) performSelector:withObject:]
28  QuartzCore                        0x30c8c61c 0x30c82000 + 42524
29  QuartzCore                        0x30c8c2a4 0x30c82000 + 41636
30  QuartzCore                        0x30c8bbb0 0x30c82000 + 39856
31  QuartzCore                        0x30c8b7d8 0x30c82000 + 38872
32  QuartzCore                        0x30c8b684 0x30c82000 + 38532
33  UIKit                             0x323d99d4 -[UIApplication _reportAppLaunchFinished]
34  UIKit                             0x3251d77c -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
35  UIKit                             0x323d87b8 -[UIApplication handleEvent:withNewEvent:]
36  UIKit                             0x323d7eb4 -[UIApplication sendEvent:]
37  UIKit                             0x323d77e8 _UIApplicationHandleEvent
38  GraphicsServices                  0x33c4dedc PurpleEventCallback
39  CoreFoundation                    0x364142ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
40  CoreFoundation                    0x364161d6 __CFRunLoopDoSource1
41  CoreFoundation                    0x3641718e __CFRunLoopRun
42  CoreFoundation                    0x363be0bc CFRunLoopRunSpecific
43  CoreFoundation                    0x363bdfca CFRunLoopRunInMode
44  UIKit                             0x32363b18 -[UIApplication _run]
45  UIKit                             0x32361fb8 UIApplicationMain
46  XYZ                        0x00002b20 main + 36
47  XYZ                        0x00002af0 start + 32

UPDATE Ich versuche, den zeitraubenden Import-Code (nur geschieht auf einem Programm-Update) auf einem separaten Thread ausgeführt werden. Ich bin Aktualisierung auch die GUI einer Alertview mit einem eingebetteten Fortschrittsbalken mit, damit der Benutzer weiß, was noch passiert. Während unseres Testprozesses funktioniert dies gut. Im Folgenden ist der Thread-Code, der funktioniert nicht scheint zu sein. Das Crash-Protokoll scheint darauf hinzudeuten, dass alle Arbeiten an dem Haupt-Thread getan wird.

    if ([database appDidUpdate] == YES) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    dbImportThread = [[NSThread alloc] initWithTarget:self selector:@selector(import) object:nil];
    [dbImportThread start];
    [pool release]; 

- (void)import {
 //do importing work and update the gui with the progress
}
War es hilfreich?

Lösung

Sie blockieren noch den Haupt-Thread zu lang - sei es während des Starts oder später. Nur tut leichte GUI Arbeiten an dem Haupt-Thread. Der Haupt-Thread wird auch gesperrt, wenn Sie die Arbeit an einem zweiten Thread ausführen, sondern für die Ergebnisse in Ihrem Haupt-Thread warten.

Instruments ist dein Freund hier.

Andere Tipps

scheint alles auf dem Hauptthread durch die ... (bin ich richtig?) Wenn dies der Fall ist, kann es die Benutzeroberfläche fest. Finden Sie Ihre Datenbankinformationen auf einem anderen Thread zu laden und Ihre GUI aktualisieren, wie Sie die Daten? zweitens, können Sie die Leistung jedes Stück Code in Zeit cosuming Beziehung und sehen Sie messen, was genau es so viel Zeit, um Last nimmt.

seine Einstellung aus einem Watchdog-Timer. seine Blockierung des Hauptthread für mehr als 20 Sekunden. wie gesagt, müssen Sie faul Last. nur etwas laden, die auf dem ersten Bildschirm sichtbar sein werden.

einige Zeitprofile laufen auf es Instrumente,  versuchen und fix alles, was besonders ineffizient ist und versuchen, Kick so viel wie Sie mit auf einen Hintergrund-Thread wegkommen kann. (IE alles, was nicht gehen werden, um die UI-Aktualisierung) Sie können viele Daten auf einem Hintergrund-Thread laden, und sobald die Datenobjekte eingerichtet sind, sie wieder zu dem Haupt-Thread übergeben, und einen Update Wähler von dort.

Obwohl ich mit dieser direkten Erfahrung nicht haben, nach dem Crash-Protokoll zu lesen, scheint es, dass das Gerät bemerkt Ihre App 100% CPU-Zeit für etwas länger als 20 Sekunden nach dem Start nehmen. Es scheint, dass, obwohl diese CPU-Auslastung nicht innerhalb der applicationDidFinishLaunching: Methode ist, wird das Betriebssystem nicht täuschen und endet Ihre Anwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top