iOS开发: 多线程
2015-09-26 14:49
337 查看
iOS开发: 多线程
一、多线程概述:
程序:有源代码生成的可执行应用:QQ.app;
进程:一个正在运行的程序就是一个进程,进程拥有独立运行所需的全部资源:正在运行的QQ就是一个进程;
线程:程序中独立运行的代码段:接收QQ消息的代码;
1、一个进程是由一个或多个线程组成,进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
2、主线程负责执行程序的所有代码:UI展现、添加以及刷新,网络请求,本地存储等,这些代码只能顺序执行,无法并行执行。
二、多线程实现种类:
(1).NSThread: 优点:代码简单、执行方便
缺点:性能低,效率低
两种方式:
1。//开辟线程:
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadAction) object:@"thread"];
//启动线程:需要手动开启线程
[thread start];
2。自动开启线程
[NSThread detachNewThreadSelector:@selector(threadAction) toTarget:self withObject:nil];
(2).NSOperation是一个抽象类,需要用子类去实现多线程的任务
//第一个子类
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downLoadImage) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(threadCountNumber) object:nil];
//NSOperation的另外一个子类:
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"当前线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
}];
//创建operation队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//设置队列元素上限
[queue setMaxConcurrentOperationCount:3];
//限制某个任务在某个任务之后执行
// [operation2 addDependency:operation1];
//将任务添加进队列
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:blockOperation];
}
- (void)downLoadImage{
NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
//让图片的加载与缓存在支路里执行,只让赋值在主线程里进行就行
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
- (void)updateUI:(UIImage *)image{
_imageView.image = image;
}
(3)GCD:Grand Central Dispatch
1。//系统的串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//执行线程任务
dispatch_async(mainQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
//自定义串行队列
//参数:1:自定义串行队列的名字;2:系统预留参数
dispatch_queue_t myQueue = dispatch_queue_create("com.Kevin.myQueue", 0);
//执行队列任务
dispatch_async(myQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
2。 //系统的并行
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//执行队列任务
dispatch_async(globalQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
//自定义并行
dispatch_queue_t myGlobalQueue = dispatch_queue_create("com.lanou0710.myGlobalQueue", DISPATCH_QUEUE_CONCURRENT);
//执行队列任务
dispatch_async(myGlobalQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
拓展:
#warning 延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"此block中的内容会延迟3s执行");
});
#warning 只走一次的方法
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"此block中的内容只会走一次");
});
一、多线程概述:
程序:有源代码生成的可执行应用:QQ.app;
进程:一个正在运行的程序就是一个进程,进程拥有独立运行所需的全部资源:正在运行的QQ就是一个进程;
线程:程序中独立运行的代码段:接收QQ消息的代码;
1、一个进程是由一个或多个线程组成,进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行。
2、主线程负责执行程序的所有代码:UI展现、添加以及刷新,网络请求,本地存储等,这些代码只能顺序执行,无法并行执行。
二、多线程实现种类:
(1).NSThread: 优点:代码简单、执行方便
缺点:性能低,效率低
两种方式:
1。//开辟线程:
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadAction) object:@"thread"];
//启动线程:需要手动开启线程
[thread start];
2。自动开启线程
[NSThread detachNewThreadSelector:@selector(threadAction) toTarget:self withObject:nil];
(2).NSOperation是一个抽象类,需要用子类去实现多线程的任务
//第一个子类
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downLoadImage) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(threadCountNumber) object:nil];
//NSOperation的另外一个子类:
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"当前线程:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
}];
//创建operation队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//设置队列元素上限
[queue setMaxConcurrentOperationCount:3];
//限制某个任务在某个任务之后执行
// [operation2 addDependency:operation1];
//将任务添加进队列
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:blockOperation];
}
- (void)downLoadImage{
NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
//让图片的加载与缓存在支路里执行,只让赋值在主线程里进行就行
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
- (void)updateUI:(UIImage *)image{
_imageView.image = image;
}
(3)GCD:Grand Central Dispatch
1。//系统的串行队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();
//执行线程任务
dispatch_async(mainQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
//自定义串行队列
//参数:1:自定义串行队列的名字;2:系统预留参数
dispatch_queue_t myQueue = dispatch_queue_create("com.Kevin.myQueue", 0);
//执行队列任务
dispatch_async(myQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
2。 //系统的并行
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//执行队列任务
dispatch_async(globalQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
//自定义并行
dispatch_queue_t myGlobalQueue = dispatch_queue_create("com.lanou0710.myGlobalQueue", DISPATCH_QUEUE_CONCURRENT);
//执行队列任务
dispatch_async(myGlobalQueue, ^{
NSLog(@"1当前线程为:%@, 是否是主线程:%d", [NSThread currentThread], [NSThread isMainThread]);
});
拓展:
#warning 延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"此block中的内容会延迟3s执行");
});
#warning 只走一次的方法
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"此block中的内容只会走一次");
});
相关文章推荐
- iOS基础-事件处理、触摸、响应者链
- 一篇搞定iOS 9适配--系列教程
- 发现了一个制作iOS图标的利器
- IOS常见错误合集
- iOS事件捕捉与传递,响应者链
- iOS基础-自定义视图、视图控制器
- 网易163邮箱配置-iOS、OS X邮箱客户端
- 监听键盘高度
- ios基础-基础视图
- 解决IOS "Illegal instruction:4"
- ios-高级排序
- iOS 开发显示文档的两种方法
- iOS开发-常用第三方开源框架介绍
- 记录从毕业到最终选择IOS,以及其它一些情况
- iOS获取沙盒中的文件名
- iOS 开发笔记-控制器翻页
- iOS tabbar 背景,右上角数字,tabbar获取方法 总结
- iOS Code Signing: 解惑
- Bios工程师手边事—battery
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)