iOS线程开发小结
在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程
1.快速线程调用
*开启后台线程执行任务
[self performSelectorInBackground:@selector(test) withObject:nil];
*回到主线程执行任务
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
2.GCD : 依赖队列执行
1> 队列类型
* 全局队列
* 所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)
* dispatch_get_global_queue
* 串行队列
* 所有添加到串行队列中的任务都是按顺序执行(开一条线程)
* dispatch_queue_create("myqueue", 0);
* 主队列
* 所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)
* dispatch_get_main_queue
2> 同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)
* 同步:dispatch_sync,在当前线程执行任务,不会开启新的线程
* 异步:dispatch_async,在其他线程执行任务,会开启新的线程
3.NSOperation\NSOperationQueue
1> 使用步骤
* 创建NSOperation
* 添加NSOperation到NSOperationQueue
2> 优点
* 更加面向对象
* 可以控制最大并发数 maxConcurrentOperationCount
* 添加任务(Operation)之间的依赖 addDependency
*/
#import "XMQViewController.h"
@interface XMQViewController ()
{
NSOperationQueue *_queue;
}
@end
@implementation XMQViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_queue = [[NSOperationQueue alloc] init];
// 控制最大并发数,最多同时执行3条线程
_queue.maxConcurrentOperationCount = 3;
// 回到主线程
// [self test];
// 线程监听
// [self gcd_group];
// GCD线程依赖
// [self gcd_barrier];
// 循环执行
[self gcd_apply];
// 全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 串行队列
// dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);
dispatch_async(queue, ^{ // 耗时操作
NSLog(@"这是一个异步线程---%@", [NSThread currentThread]);
});
}
- (IBAction)click
{
NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation---%@", [NSThread currentThread]);
}];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"operation2---%@", [NSThread currentThread]);
}];
// 该方法默认在主线程执行
// [operation start];
// 加入队列会在异步线程执行
[_queue addOperation:operation];
[_queue addOperation:operation2];
// 设置线程依赖 (operation2依赖于operation,operation执行完以后,才能执行operation2)
[operation addDependency:operation2];
}
// 延时执行某条线程
- (IBAction)click2
{
// 全局队列
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 串行队列
dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);
double delayInSeconds = 5.0;
dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(delayInNanoSeconds, queue2, ^{
NSLog(@"延迟执行");
});
}
// dispatch_group_async(异步方法)可以实现监听一组任务是否完成,完成后得到通知执行其他的操作(比如通知用户下载完成,显示UI等)
- (void)gcd_group
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group1");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"group2");
});
dispatch_group_async(group, queue, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"group3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"updateUI");
});
}
// dispatch_barrier_async 是在前面的任务执行结束后才执行,而且后面的任务必须等它执行完成之后才会执行
- (void)gcd_barrier
{
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async1");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"dispatch_async2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"dispatch_barrier_async");
[NSThread sleepForTimeInterval:4];
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async3");
});
}
// dispatch_apply 执行某个代码片段N次
- (void)gcd_apply
{
dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
dispatch_apply(10, queue, ^(size_t index) {
NSLog(@"循环执行10次");
});
}
// 回到主线程
- (void)test
{
UIImage *image = nil;
[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"更新UI界面---%@", [NSThread currentThread]);
});
}
@end
iOS线程开发小结的更多相关文章
- iOS 库 开发小结
1.基本用法 定义类,导出头文件,注意头文件,库文件的search path 2.加载资源 - 使用主工程的文件,耦合性太强 - 封装到NSBundle中 NSBundle可以封装xib storyb ...
- iOS多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
- iOS企业级开发初级课程-表视图(13集)
首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...
- ios 多线程开发(一)简介
简介 线程是在一个程序中并发的执行代码的方法之一.虽然有一些新的技术(operations, GCD)提供了更先进高效的并发实现,OS X和iOS同时也提供了创建和维护线程的接口. 这里将要介绍线程相 ...
- IOS高级开发之多线程(四)NSOperation
1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...
- vue开发小结(下)
前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...
- web前端开发与iOS终端开发的异同[转]
* {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-fami ...
- iOS应用开发最佳实践
<iOS应用开发最佳实践> 基本信息 作者: 王浩 出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...
- pdfjs viewer 开发小结
此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...
随机推荐
- vue-cli 添加到生产环境问题总结
1. 路径问题 部署到生产环境后的实际链接为: 服务器项目路径 + serviceUrl的路径 创建 GlobalConstant.js 分别配置 开发环境和生产环境的 路径 (注:此处生 ...
- Appium 并发多进程基于 Pytest框架
前言: 之前通过重写unittest的初始化方法加入设备参数进行并发,实现了基于unittest的appium多设备并发,但是考虑到unittest的框架实在过于简陋,也不方便后期的Jenkins的持 ...
- HDU 4240
http://acm.hdu.edu.cn/showproblem.php?pid=4240 题意:求最大流和流量最大的一条路径的流量的比值 题解:流量最大的路径的流量在dinic的dfs每次搜到终点 ...
- 最优比率生成树 POJ 2728 迭代或者二分
别人解题报告的链接: http://blog.sina.com.cn/s/blog_691190870101626q.html 说明一下关于精度的问题,当结果是精确到小数点后3为,你自然要把误差定为至 ...
- 使用slot编写弹窗组件
具体slot用法详见http://www.cnblogs.com/keepfool/p/5637834.html html: <!--测试弹窗--> <dialog-test v-i ...
- 动画Completed事件里获取执行该动画的UI对象
转:http://www.cnblogs.com/xyq/p/3775732.html 昨天群里有位童鞋提出如何在动画完成事件Completed里获取到执行该动画的UI对象. WPF里动画的Compl ...
- day20 python sys os time json pickl 正则
字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字.字母.标点等等. 假如你现在要求一个位置....9这10个数之一. 量词 几 ...
- StreamSets sdc rpc 测试
一个简单的参考图 destination pipeline 创建 pipeline flow sdc destination 配置 origin sdc rpc pipeline pipeline f ...
- JMeter--使用URL回写来处理用户会话
如果测试的Web应用系统使用URL回写而非Cookie来保存会话信息,那么测试人员需要做一些额外的工作来测试web站点 为了正确回应URL回写,JMeter需要解析从服务器收到的HTML,并得到唯一的 ...
- 1、zookeeper集群安装
前提准备3台centos7.0虚拟机 c7003:192.168.70.103 c7004:192.168.70.104 c7005:192.168.70.105 并在三台虚拟机上配置hosts为 1 ...