1.開胃小菜
怎么用GCD 下載圖片呢? ,并且下載的時候顯示loading ,這就要異步下載,且不阻塞主線程。
// 開啟一個線程進行數(shù)據(jù)請求
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url1 = [NSURL URLWithString:@"http://pic.qiantucdn.com/58pic/18/32/08/32658PICPUs_1024.png"];
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:url1];
if (data != nil) {
// 在主線程中完成UI操作
dispatch_async(dispatch_get_main_queue(), ^{
[self.indicator stopAnimating];
self.indicator.hidden = YES;
UIImage *image = [UIImage imageWithData:data];
self.imgV.image = image;
});
}else {
NSLog(@"error whin download:%@",error);
}
});
2. GCD 多個網(wǎng)絡請求
在開發(fā)中經(jīng)常遇到 ,一個頁面有多個網(wǎng)絡請求,要在多個網(wǎng)絡請求之后再刷新UI,這個問題該怎么解決呢。
方法一 : 用CGD Group 實現(xiàn),請看代碼。
self 循環(huán)引用 請忽略,不是本文章的重點。
-(void)requestAll_GCDGroup{
// 方法一: GCD的leave和enter 我們利用dispatch_group_t創(chuàng)建隊列組,手動管理group關(guān)聯(lián)的block運行狀態(tài),進入和退出group的次數(shù)必須匹配。
//1.創(chuàng)建隊列組
dispatch_group_t group = dispatch_group_create();
//2.創(chuàng)建隊列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//3.添加請求
dispatch_group_async(group, queue, ^{
dispatch_group_enter(group);
[self requestTopWithSuccessCallBack:^(NSArray *array) {
self.topArr = array;
dispatch_group_leave(group);
} failCallback:^(bool isFail) {
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
dispatch_group_enter(group);
[self requestShehuiWithSuccessCallBack:^(NSArray *array) {
self.shehuiArr = array;
dispatch_group_leave(group);
} failCallback:^(bool isFail) {
dispatch_group_leave(group);
}];
});
dispatch_group_async(group, queue, ^{
dispatch_group_enter(group);
[self requestGuoneiWithSuccessCallBack:^(NSArray *array) {
self.guoneiArr = array;
dispatch_group_leave(group);
} failCallback:^(bool isFail) {
dispatch_group_leave(group);
}];
});
//4.隊列組所有請求完成回調(diào)刷新UI
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// NSLog(@"model:%f",_buyingStrategyModel.leverrisk);
NSLog(@"加載完成");
[self.mainTable.mj_header endRefreshing];
[self.mainTable reloadData];
});
}
方法二: GCD的信號量dispatch_semaphore_t
這種方式有點類似于通知模式,是利用監(jiān)聽信號量來發(fā)送消息以達到并發(fā)處理的效果,我們來看看代碼:
//方法 二:
-(void)requestAll_GCDSemaphore{
//創(chuàng)建信號量
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
//1
[self requestTopWithSuccessCallBack:^(NSArray *array) {
self.topArr = array;
dispatch_semaphore_signal(semaphore);
} failCallback:^(bool isFail) {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_async(group, queue, ^{
//2
[self requestShehuiWithSuccessCallBack:^(NSArray *array) {
self.shehuiArr = array;
dispatch_semaphore_signal(semaphore);
} failCallback:^(bool isFail) {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_async(group, queue, ^{
//3
[self requestGuoneiWithSuccessCallBack:^(NSArray *array) {
self.guoneiArr = array;
dispatch_semaphore_signal(semaphore);
} failCallback:^(bool isFail) {
dispatch_semaphore_signal(semaphore);
}];
});
dispatch_group_notify(group, queue, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"信號量為0");
dispatch_async(dispatch_get_main_queue(), ^{
// 通知主線程刷新 神馬的
[self.mainTable.mj_header endRefreshing];
[self.mainTable reloadData];
});
});
}
參考 https://blog.csdn.net/pianzhidenanren/article/details/52571853
三.效果demo源碼
下面是demo 源碼地址,可以運行的項目。有需要的同學可以看下。
demo 效果圖:

image.png
內(nèi)頁-實現(xiàn)頁

image.png
頭條是一個網(wǎng)絡請求,
社會是一個網(wǎng)絡請求
國內(nèi)是一個網(wǎng)絡請求。 共三個請求。三個請求都結(jié)束的時候 ,結(jié)束下拉刷新。
參考:https://blog.csdn.net/lee_woxinyiran/article/details/80790578
demo地址 https://gitee.com/Sunny0123/GCDTest