2011-12-07 377 views
9

IAM的有問題:併發隊列與GCD? (的iOS 4.2.1)

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0UL); 

concurrentQueuenil在iOS 4.2.1(裝置),但相同的代碼完美地工作,其運行iOS 5.0.1另一設備上。

當我檢查標題它說它是可用的,因爲iOS 4.0,我做錯了什麼?

下面的代碼從互聯網獲取圖片,並且在4.2.1之後的所有內容中都很好用,但是在4.2.1中並沒有,任何想法爲什麼?你可以使用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]; 
       }); 
      }   
     }); 
    }); 
} 

回答

32

看起來DISPATCH_QUEUE_PRIORITY_BACKGROUND僅適用於iOS 5.0及更高版本。

DISPATCH_QUEUE_PRIORITY_BACKGROUND 派發到隊列中的項目以後臺優先級運行;在調度了所有高優先級隊列並且系統在優先級設置爲後臺狀態的線程上運行項目之後,隊列被調度執行。這樣的線程具有最低的優先級,並且任何磁盤I/O都會受到限制,以最大限度地減少對系統的影響。 Available in iOS 5.0及更高。

Found here

在這種情況下用戶運行的是iOS 4的,你可以用DISPATCH_QUEUE_PRIORITY_LOW去,然後用DISPATCH_QUEUE_PRIORITY_BACKGROUND爲iOS 5及更高版本。

編輯

該文檔是有點誤導,如果你不在這種情況下仔細閱讀它。

enter image description here

+0

謝謝先生,我欣然接受了你的回答! – Konrad77

+0

當DISPATCH_QUEUE_PRIORITY_BACKGROUND不可用時,自動將DISPATCH_QUEUE_PRIORITY_BACKGROUND替換爲DISPATCH_QUEUE_PRIORITY_LOW會很有幫助。 – slatvick

+0

那麼在iOS 5之前將某些東西分派到後臺線程的最佳做法是什麼? – Tomen