2011-12-07 4 views
9

Iam di problemi con:Coda concomitante con GCD? (IOS 4.2.1)

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 

concurrentQueue è nil su iOS 4.2.1 (periferica), ma lo stesso codice funziona perfettamente su un altro dispositivo che esegue IOS 5.0.1.

Quando ho controllato l'intestazione dice che è disponibile da iOS 4.0, sto facendo qualcosa di sbagliato?

Il codice qui sotto recupera le immagini da Internet e funziona alla grande in tutto dopo 4.2.1 ma non in 4.2.1, qualche idea perché? Puoi creare una coda concorrente in un altro modo 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]; 
       }); 
      }   
     }); 
    }); 
} 

risposta

32

Sembra DISPATCH_QUEUE_PRIORITY_BACKGROUND è disponibile solo per iOS 5.0 e versioni successive.

DISPATCH_QUEUE_PRIORITY_BACKGROUND Gli articoli inviati alla coda vengono eseguiti con priorità sullo sfondo; la coda è pianificata per l'esecuzione dopo che tutte le code ad alta priorità sono state pianificate e il sistema esegue elementi su un thread la cui priorità è impostata per lo stato in background. Tale thread ha la priorità più bassa e qualsiasi I/O del disco viene limitato per minimizzare l'impatto sul sistema. Disponibile in iOS 5.0 e versioni successive.

Found here

Nel caso l'utente è in esecuzione iOS 4 si potrebbe andare con DISPATCH_QUEUE_PRIORITY_LOW e quindi utilizzare DISPATCH_QUEUE_PRIORITY_BACKGROUND per iOS 5 e versioni successive.

Modifica

La documentazione è un po 'fuorviante, se non avete letto attentamente in questo caso.

enter image description here

+0

Grazie signore, ho accettato volentieri la tua risposta! – Konrad77

+0

Sarebbe utile sostituire automaticamente DISPATCH_QUEUE_PRIORITY_BACKGROUND a DISPATCH_QUEUE_PRIORITY_LOW quando DISPATCH_QUEUE_PRIORITY_BACKGROUND non è disponibile. – slatvick

+0

quindi qual è la procedura migliore prima di iOS 5 per inviare qualcosa a un thread in background? – Tomen