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没有的功能:
    设置最大并发数
    依赖
     
  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/lignpeng/p/5458308.html
Copyright © 2011-2022 走看看