2011-10-27 10 views
5

Me arranco el pelo con esto, cualquier idea o sugerencia sería muy apreciada.performSelectorOnMainThread no ejecuta

Tengo un objeto que llama al performSelectorOnMainThread:withObject:waitUntilDone: en sí mismo desde una hebra secundaria. Esto funciona bien el 95% del tiempo. De vez en cuando desde betas iOS y ahora en versión, un dispositivo se negará a ejecutar las llamadas performSelectorOnMainThread:withObject:waitUntilDone: ... No hay mensaje de error, no se bloquea, no puedo hacer que un dispositivo entre en un estado en el que "falla" "pero una vez que está allí, continúa fallando hasta que elimine y vuelva a instalar la aplicación, o la obligue a abandonarla, luego ajuste la asignación de servicios de ubicación, luego vuelva a abrirla y luego reajuste nuevamente los servicios de ubicación para volver a la normalidad. .. reiniciar el dispositivo no lo arregla. Volver a instalar sin eliminar primero no lo soluciona. Es muy extraño ... Sé que funciona la mayor parte del tiempo porque la mayoría de los dispositivos no tienen problemas, sin embargo, algunos dispositivos fallan con cierta regularidad (cada 3 o 4 días, tal vez). Sé que es específicamente que performSelectorOnMainThread:withObject:waitUntilDone: no está llamando lo que debería porque ahora tengo un dispositivo defectuoso y puse un NSLog en el método que debería llamarse. Funciona bien, pero en el dispositivo defectuoso, cuando se usa performSelectorOnMainThread:withObject:waitUntilDone: para llamar a ese método, el NSLog muestra que no se está ejecutando ...

Esto comenzó a suceder con las betas iOS 5 y nuevamente, ocurre en la versión. Sucede más a menudo en 2 de mis dispositivos, pero en ninguno de los otros 10 dispositivos con los que he probado personalmente. Supuse que era solo mi dispositivo por algún inconveniente en la versión beta, pero sucede en mi nuevo 4S que nunca tocó beta, así como en el iPad 2 de un usuario (no en mi iPad 2).

Realmente no sé dónde buscar. Le digo que ejecute y normalmente lo hace en casi todos los dispositivos, pero la misma línea no obtiene respuesta y no hay errores, etc. en algunos ...

+0

son ¿Estás usando CoreData por casualidad? Tuve un problema similar. Lo que realmente estaba sucediendo era un punto muerto de subprocesos a la espera de realizar una operación de lectura con CoreData mientras el otro subproceso intentaba escribir. – picciano

+0

@picciano ¿cómo te salvaste esto? Estoy experimentando el mismo problema y no puedo entender qué debo hacer para solucionar el punto muerto. –

Respuesta

3

performSelectorOnMainThread: withObject: waitUntilDone puede ser wonky a veces. ¿Has pensado en tratar de usar lib dispatch?

Puede crear un bloque y colocarlo en el hilo principal de esta manera:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

Esto tendría el mismo saque de arco efecto que el uso de performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

RunLoop tiene varios modos diferentes de un hilo. Es posible que durante el tiempo que realice la llamada, el hilo principal está funcionando en un modo diferente a la predeterminada (que es el blanco de los performSelectorOnMainThread:withObject:WaitUntilDone:.

considerar el uso de performSelectorOnMainThread:withObject:waitUntilDone:modes:
Ver Apple's documentation.

también - GCD (libdispatch) es impresionante, pero no le protegerá de cocinar usted mismo un callejón sin salida: Considere el caso en que su método se ejecuta en el hilo principal y que está llamando:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
Cuestiones relacionadas