zoukankan      html  css  js  c++  java
  • 多线程NSOperation

     
    NSOperation(经常使用):
    1、为什么会有NSOperation?
    弥补gcd的一些问题:
    1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消block之内操作
    2)提供了gcd不能提供很多功能()
     
    2、什么是NSOperation?
    1. 面向oc的接口;基于gcd的多线程解决方案
    2. queue队列的类型:主队列/非主队列
    3. 任务执行的方式:同步/异步
     
    3、如何使用NSOperation?
    1. 无法直接使用NSOperation类
    2. 只能使用两个子类:
    NSInvocationOperation (了解;几乎都不用)
    NSBlockOperation (理解;重点)
    执行方式:
    1. 同步:
    使用NSBlockOperation的addExecutionBlock方法,如果是一个操作会在主线程中做

    2. 异步
    1) 使用NSBlockOperation的addExecutionBlock方法,如果是多个操作,第一个会在主线程中做;剩余的会在子线程中做
    2)将NSBlockOperation加入到非主队列中,会自动启动子线程来执行;但是不确定同一时间会启动多少个线程来执行
     
    3. 队列:NSOperationQueue (掌握)
    4. NSBlockOperation + NSOperationQueue (掌握)
    //----------------------------------------------------------
    -(void)displayss{
        for (int i=0; i<3; i++) {
            NSLog(@"....%d....",i);
        }
    }
    - (IBAction)blockOperation:(id)sender {
        //addExecutionBlock添加一个blockOperation,会在主线程中执行
        //如果多个,剩下的都会在子线程中执行
        //1.创建NSBlockOperation
        NSBlockOperation *operation = [[NSBlockOperation alloc] init];
        //2.添加要执行的任务
        [operation addExecutionBlock:^{
            NSLog(@"下载图片一: %@", [NSThread currentThread]);
            [self displayss];
        }];
        [operation addExecutionBlock:^{
            NSLog(@"下载图片二: %@", [NSThread currentThread]);
            [self displayss];
        }];
        [operation addExecutionBlock:^{
            NSLog(@"下载图片三: %@", [NSThread currentThread]);
            [self displayss];
        }];
        //3.启动执行任务
        [operation start];
    }
    //----------------------------------------------------------
    NSOperation总结:
    队列类型
    1. 主队列(添加到主队列中的操作都会在主线程中执行):[NSOperationQueue mainQueue]
    2. 非主队列(添加到非主队列中的操作都会在子线程中执行):[[NSOperationQueue alloc] init];

    设置最大并发数(执行操作的子线程数): 设置NSOperationQueue的maxConcurrentOperationCount属性

    添加操作到队列中的两种方式:
    1. 使用addOperationQueue方法
    2. 使用addOperationWithBlock: (^{})方法

    取消/暂停/恢复操作:
    1. 取消所有操作:cancelAllOperations
    2. 暂停所有操作:[queue setSuspended:YES];
    3. 恢复所有操作:[queue setSuspended:NO];

    操作依赖的设置:
    [operation addDependency: otherOperation];
     
    dispatch_create(queue, ^{//任务})
     
     
    什么时候使用NSOperation还是GCD
    GCD没有的功能:
    设置最大并发数
    依赖
     
  • 相关阅读:
    javascript 将中文符号转换成英文符号
    js 函数定义的2种方式
    javascript 面向对象编程(工厂模式、构造函数模式、原型模式)
    10.2.0.4 to 10.2.0.5 Installation of Patch Set Release (Windows)
    流接口驱动程序的工作原理和开发步骤嵌入式
    android开发面试题
    ORACLE-014:oracle中查看DBLinkpassword
    Java相关知识(一)
    Android 中模仿 Twitter 实现 Toolbar Indicator
    使用excel进行数据挖掘(3)----类别检測
  • 原文地址:https://www.cnblogs.com/lignpeng/p/5458308.html
Copyright © 2011-2022 走看看