zoukankan      html  css  js  c++  java
  • NSOperation/NSOperationQueue详细使用介绍

     
    一、简介
    (1)是使用GCD实现的一套Objective-C的API
    (2)是面向对象的线程技术
    (3)提供了一些在GCD中不容易实现的特性,如:限制最大并发数量、操作之间的依赖关系
     
    NSOperationQueue有两种不同类型的队列:主队列和自定义队列
    主队列运行在主线程上
    自定义队列在后台执行
    队列处理的任务是NSOperation的子类
    (1)NSInvocationOperation
    (2)NSBlockOperation
     
    二、NSInvocationOperation (调度操作用法)
    备注:NSInvocationOperation需要配合NSOperationQueue能实现多线程编程
     NSInvocationOperation:单个任务时,默认同步执行,多个任务时,会自动开启线程,异步执行,要控制最大线程数
    具体步骤:

    (1)先将需要执行的操作封装到一个NSInvocationOperation对象中

    (2)然后将NSInvocationOperation对象添加到NSOperationQueue中

    (3)系统会自动将NSOperationQueue中的NSInvocationOperation取出来

    (4)将取出的NSInvocationOperation封装的操作放到N条新线程中执行

    1、NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];  创建任    

               务

    2、NSOperationQueue *queue = [[NSOperationQueue alloc] init];             创建队列

        queue.maxConcurrentOperationCount = 2;     设置最大并发线程数

    3、[queue addOperation:operation1];    向队列添加任务,一个任务可以有多个操作

    4、operation.completionBlock = ^{

            // ...下载完图片后想做事情

            NSLog(@"NSBlockOperation------下载图片完毕---%@", [NSThread currentThread]);

        };    一个任务执行完毕之后需要做的事

    5、[operation2 addDependency:operation3];  设置任务间依赖关系,operation3执行完毕之后才可以执行operation2,但是不可以循环依赖

    6、[queue addOperation:operation1];添加任务到队列,自动执行操作, 自动开启线程

    7、[operation start];     不将任务放入队列,直接执行操作(默认情况下, 如果操作没有放到队列queue中, 都是同步执行,就是在调用start方法的那个线程中直接执行

    )

    9、[NSThread sleepForTimeInterval:0.1]   线程休眠

    三、NSBlockOperation(块操作用法)

    备注:NSBlockOperation需要配合NSOperationQueue能实现多线程编程
     NSOperation:单个任务时,默认同步执行,多个任务时,会自动开启线程,异步执行,要控制最大线程数
    具体步骤:

    (1)先将需要执行的操作封装到一个NSBlockOperation对象中

    (2)然后将NSBlockOperation对象添加到NSOperationQueue中

    (3)系统会自动将NSOperationQueue中的NSBlockOperation取出来

    (4)将取出的NSBlockOperation封装的操作放到N条新线程中执行

    1、NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

            NSLog(@"NSBlockOperation------下载图片1---%@", [NSThread currentThread]);

        }];   封装一个操作

       [operation1 addExecutionBlock:^{

            NSLog(@"NSBlockOperation------下载图片22---%@", [NSThread currentThread]);

        }];也可以通过这种方式添加操作

    2、NSOperationQueue *queue = [[NSOperationQueue alloc] init];             创建队列

        queue.maxConcurrentOperationCount = 2;     设置最大并发线程数

    3、[queue addOperation:operation1];    向队列添加任务,一个任务可以有多个操作

        [queue addOperationWithBlock:^{

            NSLog(@"NSBlockOperation------下载图片3---%@", [NSThread currentThread]);

        }];            也可以这种方式直接向队列添加任务

    4、operation.completionBlock = ^{

            // ...下载完图片后想做事情

            NSLog(@"NSBlockOperation------下载图片完毕---%@", [NSThread currentThread]);

        };    一个任务执行完毕之后需要做的事

    5、NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];  创建任        

               务

    6、[operation2 addDependency:operation3];  设置任务间依赖关系,operation3执行完毕之后才可以执行operation2,但是不可以循环依赖

    7、[queue addOperation:operation1];添加任务到队列,自动执行操作, 自动开启线程

    8、[operation start];     不将任务放入队列,直接执行操作(默认情况下, 如果操作没有放到队列queue中, 都是同步执行,就是在调用start方法的那个线程中直接执行

    )

    9、[NSThread sleepForTimeInterval:0.1]   线程休眠

  • 相关阅读:
    flex 按钮自定义皮肤
    SQl查询数据库库名,表名、表的列名
    导出到excel文件
    信息安全技术 实验一 JS 实现 Source code CryptoJS
    python学习
    博客园可以直接写可运行的JS,还可以传文件,我爱死你啦 力挺博客园
    Javascript 数的表示与位运算
    交换两个值
    开发Question
    2272012 笔记 开机启动服务
  • 原文地址:https://www.cnblogs.com/hepingqingfeng/p/5457750.html
Copyright © 2011-2022 走看看