文档章节

NSOperationQueue

阿元
 阿元
发布于 2016/05/17 10:11
字数 489
阅读 15
收藏 0
点赞 2
评论 0

 


#import <UIKit/UIKit.h>

@interface VCRoot : UIViewController

@end
#import "VCRoot.h"

@interface VCRoot ()
@property (assign,atomic) int count ;
@end

@implementation VCRoot
{
    //任务队列
    //可以将任务(线程的抽象)添加到队列中来管理
    //可以同时并发多个任务
    NSOperationQueue* _optQueue ;
    NSData* data  ;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //创建一个任务队列
    //队列中的元素为任务对象
    //任务对象继承于NSOperation
    _optQueue = [[NSOperationQueue alloc] init] ;
    
    //设置任务的最大并发数量
    [_optQueue setMaxConcurrentOperationCount:5] ;
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //创建一个任务对象
    //将事件函数封装到任务中
    //将来在队列中执行
    NSInvocationOperation* tast01 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateOpt01) object:nil] ;
    //将任务添加到队列中
    [_optQueue addOperation:tast01] ;
    
    
    //方法二
    //创建一个任务属性对象
    NSInvocation* invo = [[NSInvocation alloc] init] ;
    //目标对象
    invo.target = self ;
    //事件函数
    invo.selector = @selector(updateOpt02) ;
    
    NSInvocationOperation* tast02 = [[NSInvocationOperation alloc] initWithInvocation:invo] ;
    //将第二个任务添加到队列中
    [_optQueue addOperation:tast02] ;
    
    
    //方法三
    NSMutableArray* arrayTask = [[NSMutableArray alloc] init] ;
    for (int i = 0 ; i < 3; i++)
    {
        //创建多个任务,将任务添加到数组中
        NSInvocationOperation* task = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateOpt) object:nil] ;
    
        [arrayTask addObject:task] ;
    }
    //将任务数组添加到任务队列中
    //是否等待之前的任务结束后开始执行
    [_optQueue addOperations:arrayTask waitUntilFinished:YES] ;
    
//    第四种方法,使用block来添加任务
//    添加一个block块对象作为任务队列的任务
    [_optQueue addOperationWithBlock:^
    {
        int count = 0 ;
        for (int i = 0 ; i < 10000; i++)
        {
            count++ ;
            NSLog(@"count = %d",count) ;
        }
    }] ;
}

-(void) readFile
{
    data = [NSData dataWithContentsOfFile:@"/users/qianfeng/Desktop/office.zip"] ;
}

-(void) updateOpt01
{
    NSLog(@"任务一执行....");
    
    [data writeToFile:@"/users/qianfeng/Desktop/office01.zip" atomically:YES] ;
    
//    [NSThread exit] ;
    
    NSThread* t = [NSThread currentThread] ;
    [t cancel] ;
    while (true)
    {
        //休眠时间
        [NSThread sleepForTimeInterval:0.01] ;
        NSLock* lock = [[NSLock alloc] init] ;
        
        int k = 0 ;
        
        [lock lock] ;
        k++ ;
        [lock unlock] ;
        
        [NSThread isMainThread] ;
    }

}

-(void) updateOpt11
{
    NSLog(@"任务一执行....");
    
    [data writeToFile:@"/users/qianfeng/Desktop/office02.zip" atomically:YES] ;
}

-(void) updateOpt12
{
    NSLog(@"任务一执行....");
    
    [data writeToFile:@"/users/qianfeng/Desktop/office03.zip" atomically:YES] ;
}

-(void) updateOpt02
{
    NSLog(@"任务二执行...");
}

-(void) updateOpt
{
    NSLog(@"任务数组中的任务执行!");
    [NSThread sleepForTimeInterval:5];
}

@end

© 著作权归作者所有

共有 人打赏支持
阿元
粉丝 5
博文 154
码字总数 98469
作品 0
浦东
程序员
iOS GCD 与 NSOperationQueue对比

NSOperationQueue 是在GCD基础上实现的,只不过是GCD更高一层的抽象。 GCD 只支持FIFO 的队列, 而NSOperationQueue可以调整队列的执行顺序。(通过调整权重) NSOperationQueue可以在Opera...

董桉远 ⋅ 2013/11/26 ⋅ 0

iphone多线程汇总

1,NSThread - (void)updateImageForCellAtIndexPath:(NSIndexPath )indexPath { NSAutoreleasePool pool = [[NSAutoreleasePool alloc] init]; UIImage *image = [self getImageForCellAtInd......

长平狐 ⋅ 2012/08/13 ⋅ 0

iOS多线程之NSOperation

1.简介 1.1NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.2NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation...

JlongTian ⋅ 2016/01/10 ⋅ 0

iOS之[多线程:NSOperation]

NSOperation :fa-exclamation-triangle:以下是你需要考虑使用 NSOperation 的一些理由: 1.当你需要取消线程任务时,GCD 无法提供取消任务的操作。而 NSOperation 提供了取消任务的操作; 2.当...

言筱羽 ⋅ 2015/11/23 ⋅ 0

iOS多线程:『NSOperation、NSOperationQueue』详尽总结

iOS多线程:『NSOperation、NSOperationQueue』详尽总结 转载: 原地址https://www.jianshu.com/p/4b1d77054b35 本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文更新时间:2018年0...

法斗斗 ⋅ 04/20 ⋅ 0

iOS--多线程之NSOperation

做一下整理,与大家分享,不足之处请留言: 使用NSOperation时,需要使用其子类:子类有三种方式 1.NSInvocationOperation 2.NSBlockOperation 3.自定义子类继承NSOperation,实现内部相应的...

指尖流年 ⋅ 2017/03/27 ⋅ 0

多线程的底层实现机制

1.多线程的底层实现 (1)首先回答什么是线程 1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 (2)什么是多线程 1个进程中可以开...

万能的匹诺曹 ⋅ 2016/06/22 ⋅ 0

【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。 一、NSOperation与GCD的比较 GCD是基于c的底层...

xn4545945 ⋅ 2014/07/28 ⋅ 0

NSOperationQueue

NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤先将需要执行的操作封装到一个NSOperation对象中然后将NSO...

5vinsEnt ⋅ 2016/05/25 ⋅ 0

多线程NSOperation一般使用

一、NSOperation简介 简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操...

朝雨晚风 ⋅ 2016/08/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 1分钟前 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 3分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 5分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 7分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 7分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 11分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 11分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 11分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 js /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = ['零', '壹', '贰', '叁', ...

YXMBetter ⋅ 14分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 20分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部