2010-11-30 14 views
5

Estamos recibiendo un registro de bloqueo de conexión de iTunes que es un poco extraño.Error de aplicación de iPhone en el lanzamiento

Previamente teníamos problemas con nuestra aplicación que tardaba mucho en volver de ApplicationDidFinishLaunching. Esto fue causado por hacer demasiado trabajo dentro de applicationDidFinishLaunching y excedimos el tiempo de espera de 20 segundos en dispositivos más lentos.

Para solucionar esto, hemos movido todo nuestro código de configuración fuera de ApplicationDidFinishLaunching y lo hemos movido a un controlador de carga secundaria especial. Además de eso, movimos el código de configuración dentro de ese controlador a un hilo separado.

Sin embargo, todavía estamos viendo registros de fallos que dicen que nuestra aplicación no se pudo iniciar a tiempo aunque el registro de fallos muestra una llamada al [UIApplication _reportAppLaunchFinished]. Para mí, esto indica que la aplicación ha terminado de ejecutarse y que podemos tomar el tiempo que deseamos para ejecutar nuestro código de configuración. A continuación se muestra el registro de bloqueo.

Gracias por cualquier ayuda que pueda ofrecer.

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 

ACTUALIZACIÓN Estoy intentando ejecutar el código de importación que consume tiempo (sólo ocurre en una actualización de la aplicación) en un hilo separado. Incluso estoy actualizando la GUI usando AlertView con una barra de progreso incrustada para que el usuario sepa que algo está pasando. Durante nuestro proceso de prueba, esto funciona bien. Debajo está el código del hilo que parece no estar funcionando. El registro de bloqueo parece indicar que todo el trabajo se está realizando en el hilo principal.

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 
} 
+1

¿Toda la información que está cargando se necesita inmediatamente en la aplicación?la carga diferida debe ser tu amigo en dispositivos móviles. –

+0

+1 para @Jesse Naugher. Tienes problemas mayores que el colapso si tu diseño para una aplicación móvil requiere que tus usuarios permanezcan más de 20 segundos mientras se inicia la aplicación. Eso es solo un mal diseño. Puede resolver todos sus problemas y mejorar la aplicación en general cargando solo los datos que necesita para su visualización inmediata. – TechZen

+0

Esta carga realmente solo ocurre en una actualización. Tenemos muchos datos ingresados ​​por el usuario que guardamos en los valores predeterminados del usuario. Si la actualización viene con una nueva base de datos, entonces tenemos que importar esos datos de usuario en el nuevo db. Entonces, este caso no ocurre con demasiada frecuencia, pero en una actualización, las personas con dispositivos más lentos siempre tienen problemas. – jmurphy

Respuesta

4

Todavía está bloqueando el hilo principal demasiado tiempo, ya sea durante el inicio o más tarde. Solo haga que la GUI liviana funcione en el hilo principal. El hilo principal también está bloqueado si realiza el trabajo en un segundo hilo, pero espera los resultados en su hilo principal.

Instruments es tu amigo aquí.

+1

+1 El sistema operativo está buscando algo que parezca una IU congelar más de 20 segundos, independientemente de cuándo ocurra. – TechZen

+0

Entonces, si ejecuto el código en un hilo separado, ¿debería estar bien? Acabo de encontrar un código adicional que podría estar bloqueando la GUI. Espero poder poner eso en un hilo aparte y estar bien. – jmurphy

+0

Sí, pero el tiempo de CPU no es su problema, el tiempo de pared es. Simplemente no lo bloquees, y deberías estar bien. Y programe las actualizaciones de la GUI (corta) en el hilo principal con performSelectorOnMainThread. – Eiko

0

Aunque no tengo experiencia directa con esto, después de leer su registro de bloqueo, se observa que el dispositivo se dio cuenta de su aplicación para tomar el 100% de tiempo de CPU para un poco más de 20 segundos después de su lanzamiento. Parece que a pesar de que este uso de la CPU no está dentro del método applicationDidFinishLaunching:, el sistema operativo no se deja engañar y termina su aplicación.

1

configurando un temporizador de vigilancia. bloqueando el hilo principal durante más de 20 segundos. como se ha dicho, necesita una carga lenta. solo cargue algo que será visible en la primera pantalla.

ejecute algunos perfiles de tiempo con instrumentos, intente y arregle todo lo que sea particularmente ineficiente y trate de patear todo lo que pueda sobre un hilo de fondo. (IE todo lo que no va a actualizar el UI) puede cargar muchos datos en una cadena de fondo, y una vez que los objetos de datos han sido configurados, vuelva a pasarlos al hilo principal y ejecute un selector de actualización desde allí.

2

parece que todo está funcionando en el hilo principal ... (¿Estoy en lo cierto?) Si este es el caso, puede que se pegue la interfaz de usuario. ¿Consideró cargar la información de su base de datos en otro hilo y actualizar su GUI a medida que obtiene los datos? en segundo lugar, puede medir el rendimiento de cada fragmento de código en relación de tiempo-consumo y ver qué le toma tanto tiempo cargar.

Cuestiones relacionadas