iOS 多线程 GCD(滚床单) 的高级用法
2016-03-15 01:21
651 查看
GCD 的四种高级用法:
以下是我总结的四种 滚床单 的高级用法及示例程序 和 输出结果.
#pragma mark - 1.0 一次性执行 : 代码只执行一次
#pragma mark - 2.0
单设计模式 : 创建单例
#pragma mark - 3.0
延时执行方法 : 延时执行任务
#pragma mark - 4.0
调度组 : 监听是否一组任务执行完成
#import "ViewController.h"
#import "userManager.h"
@interface
ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)btn1:(UIButton *)sender {
[self onceDemo];
}
- (IBAction)btn2:(UIButton *)sender {
[selfshareDemo];
}
- (IBAction)btn3:(UIButton *)sender {
[selfdelayDemo];
}
- (IBAction)btn4:(UIButton *)sender {
[selfgroupDemo1];
}
- (IBAction)btn5:(UIButton *)sender {
[selfgroupDemo2];
}
#pragma mark - 1.0
一次性执行
/*!
一次性执行 onceToken默认值是0;
当不是0时,不再执行任务
*/
- (void)onceDemo{
NSLog(@"begin!");
static dispatch_once_t onceToken;
NSLog(@"%tu",onceToken);
dispatch_once(&onceToken, ^{
NSLog(@"helloWorld %@",[NSThreadcurrentThread]);
});
}
#pragma mark - 2.0
单设计模式
/*
单例:
1. 只有一个单例对象
2. 有一个全局的实例化方法
3. 它的生命周期和
应用程序一样长
4. 它在静态区
*/
/**
* 通过一次性执行创建单例创建单例类,创建获取单例方法和单例管理的方法
*/
- (void)shareDemo{
userManager * ins = [userManagersharedManger];
[ins userName];
}
#pragma mark - 3.0
延时执行方法
/**
* 延迟执行 Demo
*/
- (void)delayDemo{
NSLog(@"开始计时!");
//
过了两秒执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0
* NSEC_PER_SEC)),dispatch_get_main_queue(), ^{
NSLog(@"两秒后: %@",[NSThreadcurrentThread]);
//
再过两秒执行
dispatch_time_t when =dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(2.0 *
NSEC_PER_SEC));
dispatch_queue_t queue =dispatch_get_main_queue();
dispatch_block_t block = ^{
NSLog(@"又过了两秒两秒后: %@",[NSThreadcurrentThread]);
};
// 这个函数的参数:
延迟几秒在哪个队列
执行什么
dispatch_after(when, queue, block);
});
}
#pragma mark - 4.0
调度组
/**
* 调度组1
*/
- (void)groupDemo1{
dispatch_group_t group =dispatch_group_create();
dispatch_queue_t queue =dispatch_get_global_queue(0,0);
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务1 %@",[NSThreadcurrentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务2 %@",[NSThreadcurrentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务3 %@",[NSThreadcurrentThread]);
});
// 监听这一组异步任务是否执行结束,即使没结束也可以执行 OtherCode
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"下载完成 %@",[NSThreadcurrentThread]);
});
NSLog(@"OtherCode");
}
#pragma mark - 5.0
调度组
/**
* 调度组2
*/
- (void)groupDemo2{
dispatch_group_t group =dispatch_group_create();
dispatch_queue_t queue =dispatch_get_global_queue(0,0);
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务1 %@",[NSThreadcurrentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务2 %@",[NSThreadcurrentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载任务3 %@",[NSThreadcurrentThread]);
});
// 监听这一组异步任务是否执行结束,没结束就不可以可以执行 OtherCode
dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
NSLog(@"下载完成 %@",[NSThreadcurrentThread]);
NSLog(@"OtherCode");
}
- (void)didReceiveMemoryWarning {
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题