iOS多线程之NSOperation
来源:互联网 发布:java程序设计基础答案 编辑:程序博客网 时间:2024/05/28 05:17
NSOperation是基于GCD的一个封装. 但是比GCD多了一些简单实用的功能, 这就使NSOperation变的更加的面向对象.
NSOperation是一个抽象基类,我们使用最多的是它的子类NSInvocationOperation和NSBlockOperation。
1.同步异步,线程之间的传递信息
//NSOperationQueue 有两种队列,主队列,自定义 NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主队列 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列 //(1)主线程实现任务(同步,没意义) NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runner) object:nil]; [operation start];-(void)runner{ NSLog(@"当前的线程 %@", [NSThread currentThread]);}
//(2)NSInvocationOperation异步实现 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runner) object:nil]; //当把operation放大queue的时候,系统会自动创建异步并发队列。 [queue addOperation:operation];-(void)runner{ self.lable.text =@"20"; NSLog(@"当前的线程 %@", [NSThread currentThread]); // 2.回到主线程更新UI [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.lable.text =@"100"; NSLog(@"当前的线程 %@", [NSThread currentThread]); }]; }
//(3)NSBlockOperation self.lable.text =@"20"; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]); // 2.回到主线程,可以刷新UI [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.lable.text =@"100"; NSLog(@"当前的线程 %@", [NSThread currentThread]); }]; }]; [queue addOperation:operation1];
//(4)NSOperationQueue 添加一个block形式的Operation NSOperationQueue *queue = [[NSOperationQueue alloc] init]; self.lable.text =@"20"; [queue addOperationWithBlock:^{ sleep(2.0); // 1.执行一些比较耗时的操作 NSLog(@"group-1当前的线程 %@", [NSThread currentThread]); // 2.回到主线程 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.lable.text =@"100"; NSLog(@"当前的线程 %@", [NSThread currentThread]); }]; }];
2.线程之间可以设置依赖的关系
//2. 线程之间可以设置依赖的关系,但是要注意不能相互依赖,否则会导致死锁 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]); }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]); }]; // operation1依赖于operation2 [operation1 addDependency:operation2]; [queue addOperation:operation1]; [queue addOperation:operation2];
3.NSBlockOperation的使用并发
//3. 只要NSBlockOperation封装的操作数 > 1,就会异步执行操作。但是会在 主线程和其他线程并发执行,也就是说还是会占用当前线程。 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){ NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-1 线程:%@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-2 线程:%@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-3 线程:%@", [NSThread currentThread]); }]; // 开始执行任务 [operation start];// 如果想要不占用主线程,则需要进行下面的操作,并去掉 [operation start],因为NSOperationQueue会自动进行线程的管理// NSOperationQueue *queue = [[NSOperationQueue alloc] init];// [queue addOperation:operation];
4.NSBlockOperation异步并发
//4. 异步并行 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){ NSLog(@"group-1 %@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-2 %@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-3 %@", [NSThread currentThread]); }]; [queue addOperation:operation]; [operation setCompletionBlock:^() { NSLog(@"执行完毕"); }];
5.NSBlockOperation异步串行
//5.异步串行 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //这句代码是最重要,设置最大并发为1个就可以串行 queue.maxConcurrentOperationCount = 1; NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"group-1 %@", [NSThread currentThread]); }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"group-2 %@", [NSThread currentThread]); }]; NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^(){ sleep(2.0); NSLog(@"group-3 %@", [NSThread currentThread]); }]; [queue addOperation:operation1]; [queue addOperation:operation2]; [queue addOperation:operation3];
6.异步先并行,然后串行
//6.异步先并行,然后串行 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){ NSLog(@"group-1 %@", [NSThread currentThread]); }]; NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){ for (NSInteger i = 0 ; i<3; i++) { sleep(2.0); NSLog(@"2- %@", [NSThread currentThread]); } }]; [operation addExecutionBlock:^() { NSLog(@"group-2 %@", [NSThread currentThread]); }]; [operation addExecutionBlock:^() { NSLog(@"group-3 %@", [NSThread currentThread]); }]; //添加依赖 [operation2 addDependency:operation]; [queue addOperation:operation]; [queue addOperation:operation2]; [operation setCompletionBlock:^() { NSLog(@"operation执行完毕"); }]; [operation2 setCompletionBlock:^() { NSLog(@"operation2执行完毕"); }];
以上就是NSOperation的常见使用了,在iOS开发的过程中,如有问题欢迎交流,qq:2877025939
demo链接
感觉有用的上个星啊,哈哈。
阅读全文
0 0
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- iOS多线程之NSOperation
- ios多线程之NSOperation
- IOS多线程之NSOperation
- iOS多线程之NSOperation
- iOS --- 多线程之NSOperation
- iOS-多线程之NSOperation
- iOS -- 多线程之NSOperation
- iOS多线程之NSOperation
- IOS多线程之NSOperation
- iOS多线程之NSOperation
- ios 多线程之NSOperation
- IOS多线程开发之NSOperation
- iOS多线程之二 NSOperation
- iOS多线程编程之NSOperation
- iOS整理 -- 多线程之 NSOperation
- iOS多线程编程之NSOperation
- 《Effective C++读书笔记》--条款13:以对象管理资源
- HDR文件格式简介
- flask应用中通过requests发起新请求时一直超时或假死
- 热烈祝贺美格智能LTE Cat1 SLM750模块顺利入选中国电信天翼产品库
- QT可重入与线程安全
- iOS多线程之NSOperation
- CentOS7 tcpdump安装与使用
- 第三篇:JAVA动态(可变)参数
- 一劳永逸的搞定 flex 布局 (赞)
- 仿QQ侧边栏滑动的实现
- SpringMVC @RequestBody接收Json对象字符串
- 1043. 输出PATest(20)
- 在OpenCV某一个算子中考察某该算子的一个参数对图像处理的影响,通过循环从而选择最佳参数的方法
- 函数fseek() 用法