1.pThread 跨平台的多线程技术 , 是IEEE制定的POSIX 表示可移植性操作系统接口的多线程计数,UNIX内核平台 Unix,Linux,Mac(小红帽) (windows上有可移植的版本),C语言的API。
2.NSThread OC 线程技术
3.该方法只是初始化了一个子线程,但是线程并没有开启,必须用【thread start】 开启线程
target 调用对象
SEL 绑定的事件
object 附带的参数
4.设置线程名字 thread.name = @"dbshuuv";
5.绑定子线程的入口方法,直接开启线程
】;
6.隐式开启线程
// 直接调用方法执行
// [self performSelector:@selector(test1) withObject:nil];
7.在后台线程调用 test1方法
[self performSelectorInBackground:@selector(test1) withObject:nil];
8.图片的下载
UIImage * image = [UIImage imageWithData:[NSData datawithContentsOfURL:[NSURL URLWithString:@"图片地址"]]];
9.从子线程中回到主线程
[self performSelectorOnMainThread:@selector(mainThreadAction:) withObject:image waitUntilDone:YES];
GCD
1.GCD的创建
dispatch_queue_t queue = dispatch_queue_creat("dsns",DISPATCH_QUEUE_SERIAL NULL); 串行队列的创建
dispatch_queue_t queue = dispatch_queue_creat("dsns",DISPATCH_QUEUE_CONCURRENT); 并行队列的创建
2.任务的添加
dispatch_sync (queue,^{
NSLog(@"同步任务的添加");
});
dispatch_async (queue,^{
NSLog(@"异步任务的添加");
});
3.串行同步任务的添加,堵塞当前线程,知道自己执行完毕 , 串行异步任务的添加,依然会一个一个的执行, 并行同步任务的添加依旧是 一个一个的执行,并且都是在主线程上 ,
并行异步任务的添加,开启了多个线程,保证运行速度
4.队列组的创建
dispatch_group_t group = dispatch_group_create();
5.创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
6.向指定的队列中添加异步任务,并且将该队列和组关联起来
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 5; i++) {
NSLog(@"任务1");
}
});
dispatch_group_async(group, queue, ^{
for (int i = 0; i < 20000; i++) {
NSLog(@"任务2");
}
});
7.需要等到上诉所有的任务全部完成之后,不堵塞当前线程,在组的任务执行完之后,所要执行的总任务
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
等待所有的数据请求完毕之后,刷新界面UI
NSLog(@"---------任务完成---------");
});
8.等待所有的队列任务完成
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
9.dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (1ull * NSEC_PER_SEC));
// group 扩展用法
long result = dispatch_group_wait(group, time);
if (result == 0) { // 如果任务执行完毕
NSLog(@"任务执行完毕!!!");
} else {
NSLog(@"网络情况不佳,抛弃继续访问");
}
10.最常用的延迟调用,不会堵塞主线程,NSTimer不堵塞线程
- (void)testDelayTime {
// 1.调用runloop所属的perform delay
[self performSelector:@selector(test) withObject:nil afterDelay:3];
for(int i = 0; i < 10; i++) {
NSLog(@"%d", i);
}
}
11.睡眠当前线程3秒,在调用,堵塞当前线程
- (void)testDelayTime2 {
[NSThread sleepForTimeInterval:3];
[self test];
for(int i = 0; i < 10; i++) {
NSLog(@"%d", i);
}
}
12.GCD 创建单例
+ (instancetype)defaultViewController {
static ViewController * vc = nil;
// 保证线程安全,不会同一时间被多个线程访问
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
vc = [[ViewController alloc] init];
});
return vc;
}