2011-12-07 23 views
9

Iam tener problemas con:Cola concurrente con GCD? (IOS 4.2.1)

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 

concurrentQueue es nil en iOS 4.2.1 (dispositivo) pero el mismo código funciona perfectamente en otro dispositivo que se está ejecutando iOS 5.0.1.

Cuando revisé el encabezado, dice que está disponible desde iOS 4.0, ¿estoy haciendo algo mal?

El siguiente código obtiene imágenes de Internet y funciona muy bien en todo después de 4.2.1, pero no en 4.2.1, ¿por qué ideas? ¿Puedes crear una cola simultánea de alguna otra manera usando GCD?

- (void)imageFromURL:(NSString*)link { 

    if ([link length] == 0) 
     return; 

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 

    if (concurrentQueue == nil) 
     return; 

    dispatch_async(concurrentQueue, ^{ 

     __block UIImage* image = nil; 

     dispatch_sync(concurrentQueue, ^{ 

      NSError *error = nil; 

      NSURL *url = [[NSURL alloc] initWithString:link]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      NSData *imageData = [NSURLConnection sendSynchronousRequest:request 
                 returningResponse:nil 
                    error:&error]; 

      if (error == nil && imageData != nil) { 
       image = [UIImage imageWithData:imageData]; 
      } else { 
       DLog(@"%@", [error description]); 
      } 

      if ([self.delegate respondsToSelector:@selector(setImage:)]) { 
       dispatch_sync(dispatch_get_main_queue(), ^{ 
        [self.delegate setImage:image]; 
       }); 
      }   
     }); 
    }); 
} 

Respuesta

32

Parece DISPATCH_QUEUE_PRIORITY_BACKGROUND sólo está disponible para iOS 5.0 y posterior.

DISPATCH_QUEUE_PRIORITY_BACKGROUND Los artículos enviados a la cola se ejecutan con prioridad de fondo; la cola está programada para su ejecución después de que se hayan programado todas las colas de alta prioridad y el sistema ejecuta elementos en una secuencia cuya prioridad se establece para el estado de fondo. Tal subproceso tiene la prioridad más baja y cualquier E/S de disco se acelera para minimizar el impacto en el sistema. Disponible en iOS 5.0 y posterior.

Found here

En el caso de que el usuario está ejecutando iOS 4 que podría ir con DISPATCH_QUEUE_PRIORITY_LOW y luego usar DISPATCH_QUEUE_PRIORITY_BACKGROUND para iOS 5 y ss.

Editar

La documentación es un poco engañoso si no lo lee de cerca en este caso.

enter image description here

+0

Gracias señor, con mucho gusto acepté su respuesta! – Konrad77

+0

Sería útil reemplazar automáticamente DISPATCH_QUEUE_PRIORITY_BACKGROUND por DISPATCH_QUEUE_PRIORITY_LOW cuando DISPATCH_QUEUE_PRIORITY_BACKGROUND no está disponible. – slatvick

+0

¿cuál es la mejor práctica antes de iOS 5 para enviar algo a un hilo de fondo? – Tomen

Cuestiones relacionadas