2011-12-07 41 views
9

Iam gặp vấn đề với:Hàng đợi đồng thời với GCD? (IOS 4.2.1)

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 

concurrentQueuenil trên iOS 4.2.1 (thiết bị) nhưng cùng mã hoạt động hoàn hảo trên một thiết bị mà đang chạy iOS 5.0.1.

Khi tôi kiểm tra tiêu đề, nó cho biết nó có sẵn kể từ iOS 4.0, tôi có làm gì sai không?

Mã bên dưới tìm nạp hình ảnh từ internet và hoạt động tốt trong mọi thứ sau 4.2.1 nhưng không phải trong 4.2.1, bất kỳ ý tưởng nào tại sao? Bạn có thể tạo ra một hàng đợi đồng thời một số cách khác bằng cách sử dụng 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]; 
       }); 
      }   
     }); 
    }); 
} 

Trả lời

32

Có vẻ như DISPATCH_QUEUE_PRIORITY_BACKGROUND chỉ khả dụng cho iOS 5.0 trở lên.

DISPATCH_QUEUE_PRIORITY_BACKGROUND Các mục được gửi tới hàng đợi chạy ở mức ưu tiên nền; hàng đợi được lên kế hoạch thực hiện sau khi tất cả các hàng đợi có mức ưu tiên cao đã được lên lịch và hệ thống chạy các mục trên một chuỗi có mức độ ưu tiên được đặt cho trạng thái nền. Một luồng như vậy có mức ưu tiên thấp nhất và bất kỳ I/O đĩa nào được điều chỉnh để giảm thiểu tác động trên hệ thống. Khả dụng trong iOS 5.0 trở lên.

Found here

Trong trường hợp người dùng đang chạy iOS 4, bạn có thể đi với DISPATCH_QUEUE_PRIORITY_LOW và sau đó sử dụng DISPATCH_QUEUE_PRIORITY_BACKGROUND dành cho iOS 5 và sau đó.

Sửa

Các tài liệu là một chút sai lệch nếu bạn không đọc nó chặt chẽ trong trường hợp này.

enter image description here

+0

Cảm ơn bạn, tôi sẵn sàng chấp nhận câu trả lời của bạn! – Konrad77

+0

Sẽ hữu ích khi tự động thay thế DISPATCH_QUEUE_PRIORITY_BACKGROUND thành DISPATCH_QUEUE_PRIORITY_LOW khi DISPATCH_QUEUE_PRIORITY_BACKGROUND KHÔNG có sẵn. – slatvick

+0

Vì vậy, thực hành nào tốt nhất trước khi iOS 5 gửi một thứ gì đó đến một chuỗi nền? – Tomen

Các vấn đề liên quan