Dispatch Group的使用
來源:程序員人生 發布時間:2015-04-14 08:50:38 閱讀次數:2527次
轉自MJ偶像
Dispatch Group的使用
假定有這樣1個需求:從網絡上下載兩張不同的圖片,然后顯示到不同的UIImageView上去,1般可以這樣實現
-
-
- (UIImage *)imageWithURLString:(NSString *)urlString {
-
NSURL *url = [NSURL URLWithString:urlString];
-
NSData *data = [NSData dataWithContentsOfURL:url];
-
return [UIImage imageWithData:data];
-
}
-
-
- (void)downloadImages {
-
-
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-
-
NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";
-
UIImage *image1 = [self imageWithURLString:url1];
-
-
-
NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";
-
UIImage *image2 = [self imageWithURLString:url2];
-
-
-
dispatch_async(dispatch_get_main_queue(), ^{
-
self.imageView1.image = image1;
-
-
self.imageView2.image = image2;
-
});
-
});
-
}
雖然這類方案可以解決問題,但其實兩張圖片的下載進程其實不需要按順序履行,并發履行它們可以提高履行速度。有個注意點就是必須等兩張圖片都下載終了后才能回到主線程顯示圖片。Dispatch Group能夠在這類情況下幫我們提升性能。下面先看看Dispatch
Group的用途:
我們可使用dispatch_group_async函數將多個任務關聯到1個Dispatch Group和相應的queue中,group會并發地同時履行這些任務。而且Dispatch Group可以用來阻塞1個線程, 直到group關聯的所有的任務完成履行。有時候你必須等待任務完成的結果,然后才能繼續后面的處理。
下面用Dispatch Group優化上面的代碼:
-
-
- (UIImage *)imageWithURLString:(NSString *)urlString {
-
NSURL *url = [NSURL URLWithString:urlString];
-
NSData *data = [NSData dataWithContentsOfURL:url];
-
-
return [[UIImage alloc] initWithData:data];
-
}
-
-
- (void)downloadImages {
-
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
-
-
-
dispatch_async(queue, ^{
-
-
dispatch_group_t group = dispatch_group_create();
-
-
__block UIImage *image1 = nil;
-
__block UIImage *image2 = nil;
-
-
-
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-
-
NSString *url1 = @"http://car0.autoimg.cn/upload/spec/9579/u_20120110174805627264.jpg";
-
image1 = [self imageWithURLString:url1];
-
});
-
-
-
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-
-
NSString *url2 = @"http://hiphotos.baidu.com/lvpics/pic/item/3a86813d1fa41768bba16746.jpg";
-
image2 = [self imageWithURLString:url2];
-
});
-
-
-
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
-
self.imageView1.image = image1;
-
self.imageView2.image = image2;
-
-
-
-
-
[image1 release];
-
[image2 release];
-
});
-
-
-
dispatch_release(group);
-
});
-
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈