我有一個圖像加載器類提供NSURL負載和圖像從網絡並執行完成塊。代碼其實很簡單問題與GCD和太多的線程
- (void)downloadImageWithURL:(NSString *)URLString completion:(BELoadImageCompletionBlock)completion
{
dispatch_async(_queue, ^{
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *image = nil;
NSURL *URL = [NSURL URLWithString:URLString];
if (URL) {
image = [UIImage imageWithData:[NSData dataWithContentsOfURL:URL]];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(image, URLString);
});
});
}
當我更換
dispatch_async(_queue, ^{
與註釋掉
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
圖片加載速度更快,至極是很合乎邏輯的(在此之前,圖像將一次加載一個,現在它們中的一羣同時加載)。我的問題是,我可能有50個圖像,我調用downloadImageWithURL:completion:方法,當我使用全局隊列而不是_queue時,我的應用程序最終崩潰,我看到有85個線程。問題是我連續50次調用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0)會導致GCD創建太多線程?我認爲gcd可以處理所有的線程,並確保線程的數量不是很大,但如果不是這種情況,有什麼辦法可以影響線程的數量?
不,這與隊列優先級無關.GCD僅在現有線程上爲全局併發隊列在內核中阻塞塊時創建額外的線程,並且花費很少的時間。 – das
@das謝謝我已將一些修改,但請隨時讓我的答案更好:) – jackslash