導(dǎo)語:
每次提到多線程,iOS騷年總是說GCD(感覺有點高逼格)。當(dāng)然,做的項目自然會接觸到GCD,功能是挺強大的。博主這就不簡述GCD是什么了(因為具體博主也不知道啦~),也不說
dispatch_get_global_queue
和dispatch_get_main_queue
,大家可以去百度下,很多資料,博主主要是對于應(yīng)用做點簡述。
一:延遲dispatch_after()
一般延遲操作的時候,dispatch_after是一個很好的方法,他可以做同步的延時,也可以異步的,用的比較多的是在用MJRefresh的時候:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self getModelList];// 得到數(shù)據(jù)(做網(wǎng)絡(luò)請求)
[self.tableView.footer endRefreshing]; // (一般在數(shù)據(jù)請求結(jié)束后)調(diào)用endRefreshing可以結(jié)束刷新狀態(tài)
});
二:同時請求好多個網(wǎng)絡(luò)請求后再做最后個網(wǎng)絡(luò)請求(這種設(shè)計真的挺無奈的)或者數(shù)據(jù)庫的操作。dispatch_group
dispatch_queue_t quete = dispatch_queue_create("XIAXIAQUEUE", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(8);//假設(shè)需要八秒的網(wǎng)絡(luò)請求
NSLog(@"網(wǎng)絡(luò)任務(wù)1完成");
dispatch_group_leave(group);
});
NSLog(@"任務(wù)1完成");//可以做個區(qū)別
});
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(8);
NSLog(@"網(wǎng)絡(luò)任務(wù)2完成");
dispatch_group_leave(group);
});
NSLog(@"任務(wù)2完成");
});
dispatch_group_notify(group, quete, ^{
NSLog(@"最后執(zhí)行");
});
大功告成啦,O(∩_∩)O哈哈~ 這邊運用了dispatch_group_enter()
和dispatch_group_leave()
兩個方法,用來表示它從group中完成了,如果沒有的話,會先執(zhí)行notify力的方法。
三:倒計時
當(dāng)我們做個短信倒計時的時候,也可以用GCD做(有木有感覺很強大~)。
- (void)daojishi{
__block int timeout = 60; //倒計時時間
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0);
dispatch_source_set_event_handler(_timer, ^{
if (timeout <= 0)
{
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[_getYzmButton setTitle:@"獲取驗證碼" forState:UIControlStateNormal];
_getYzmButton.enabled = YES;
});
}
else
{
int seconds = timeout;
NSString *strTime = [NSString stringWithFormat:@"%.2d秒后重新獲取", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
[_getYzmButton setTitle:strTime forState:UIControlStateNormal];
_getYzmButton.enabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
結(jié)束語
歡迎各位小伙伴一起學(xué)習(xí)探討哦~ 寫寫收看~