导语:
每次提到多线程,iOS骚年总是说GCD(感觉有点高逼格)。当然,做的项目自然会接触到GCD,功能是挺强大的。博主这就不简述GCD是什么了(因为具体博主也不知道啦~),也不说
dispatch_get_global_queue
和dispatch_get_main_queue
,大家可以去百度下,很多资料,博主主要是对于应用做点简述。
一:延迟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];// 得到数据(做网络请求)
[self.tableView.footer endRefreshing]; // (一般在数据请求结束后)调用endRefreshing可以结束刷新状态
});
二:同时请求好多个网络请求后再做最后个网络请求(这种设计真的挺无奈的)或者数据库的操作。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);//假设需要八秒的网络请求
NSLog(@"网络任务1完成");
dispatch_group_leave(group);
});
NSLog(@"任务1完成");//可以做个区别
});
dispatch_group_enter(group);
dispatch_group_async(group, quete, ^{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(8);
NSLog(@"网络任务2完成");
dispatch_group_leave(group);
});
NSLog(@"任务2完成");
});
dispatch_group_notify(group, quete, ^{
NSLog(@"最后执行");
});
大功告成啦,O(∩_∩)O哈哈~ 这边运用了dispatch_group_enter()
和dispatch_group_leave()
两个方法,用来表示它从group中完成了,如果没有的话,会先执行notify力的方法。
三:倒计时
当我们做个短信倒计时的时候,也可以用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);
}
结束语
欢迎各位小伙伴一起学习探讨哦~ 写写收看~
网友评论