2011-10-17 25 views
7

Tengo un proyecto que descarga imágenes en segundo plano usando NSOperationQueue. Hasta ahora funcionaba en dispositivos con IOS 4.3. Sin embargo, si construyo la aplicación con base sdk 4.3 o con 5 y ejecuto la aplicación en el dispositivo con IOS5, la aplicación se bloquea. Cuando se inicia la aplicación, agrega NSOperation objetos en la cola para descargar las imágenes. Si en el medio presiono el botón de regreso, cancelo el NSOperation y se bloquea y muestra traza siguiente en la consola:NSOperationQueue no funciona en IOS5

 
#0 0x004727b7 in ____NSOQSchedule_block_invoke_0() 
#1 0x026a5618 in _dispatch_call_block_and_release() 
#2 0x026a7a10 in _dispatch_worker_thread2() 
#3 0x974bb781 in _pthread_wqthread() 
#4 0x974bb5c6 in start_wqthread() 

y grabados "ResourceLoadOperation isfinished = SÍ sin ser iniciado por la cola que se encuentra en" Si comento la llamada al método de cancelación, la aplicación no se bloquea. ¿Hay alguna actualización sobre los cambios NSOperation para IOS5?

+0

Tengo el mismo problema. Comentando el lanzamiento del objeto NSOperation hace el truco, como dijiste, pero no estoy muy seguro de que la administración de memoria sea correcta en este caso ... –

+0

Sí, solo comentar que el método de cancelación puede no ser correcto en términos de administración de memoria. ¿Pero es eso un problema de la velocidad de procesamiento en iOS 5 que está causando este problema ya que lo mismo funciona bien en los dispositivos IOS 4.3? – CKT

Respuesta

12

tenía este mismo problema cuando se construye contra iOS 5. Terminé la creación de una bandera con nombre operationStarted que era NO por defecto y que alternar a YES cuando el método start fue llamado. Luego, en mi método finish (donde genero las notificaciones de KVO), verifiqué el valor de la bandera antes de disparar las notificaciones.

La definición de la bandera se ve así:

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted; 

El start método:

- (void)start { 
    [self setOperationStarted:YES]; 
    ... 
} 

Mi método finish que se llama cuando la operación se haya completado o cancelado:

- (void)finish {  
    if (![self isOperationStarted]) return; 

    [self willChangeValueForKey:@"isExecuting"]; 
    executing = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

Eso terminó resolviendo el problema para mí. Espero que ayude a alguien más.

+0

tengo curiosidad ¿por qué necesita operación propiedad iniciada cuando ya está ejecutando para el mismo propósito? –

Cuestiones relacionadas