NSOperation

来源:互联网 发布:淘宝创业难吗 编辑:程序博客网 时间:2024/05/03 20:43

NSOperation

NSOperation的特点

  1. NSOperation是基于GCD的一个封装. 但是比GCD多了一些简单实用的功能, 这就使NSOperation变的更加的面向对象.

  2. 队列里面遵循先进先出的原则, 但在这里只是他们拿出的顺序不一样, 等到他们全部拿出之后, 就会一起执行, 所以并发执行, 因此他们并没有违背先进先出的原则.

  3. NSOperation的另一个特点就是: 他默认是在主线程中执行.只有多个任务或者放到队列中他才会开辟子线程)

    • NSInvocationOperation 和 NSBlockOperation开不开线程取决于任务的个数.
    • 但是他们要是放到队列中,就会自动开辟子线程.
    • 开辟子线程之后, 他们会自动并发执行.


NSOperation有三种形式:

  1. NSInvocationOperation
  2. NSBlockOperation
  3. 自定义NSOperation


线程的设置

// 设置最大并发数, 线程并发数和线程的id没有任何关系 queue.maxConcurrentOperationCount

// 取消队列 [queue cancelAllOperations];

// 挂起队列 [queue setSuspended:YES];

// 恢复队列 [queue setSuspended:NO];

// 设置优先级 operation.queuePriority = NSOperationQueuePriorityHigh

// 设置依赖 [operation1 addDependency:operation];


NSOperation 的强大之处在于可以在不同的线程之间创建依赖, 设置监听.

NSOperation线程依赖:

    NSInvocationOperation *operation = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(download)object:nil];    NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(download1)object:nil];    NSBlockOperation *operation2 = [NSBlockOperationblockOperationWithBlock:^{        NSLog(@"======222===, %@", [NSThreadcurrentThread]);    }];    [operation2 addExecutionBlock:^{        NSLog(@"=====33333==, %@", [NSThreadcurrentThread]);    }];    // 可以设置任务优先级    NSOperationQueue *queue = [[NSOperationQueuealloc]init];    // 最大并发数同一时间可以执行的线程个数    queue.maxConcurrentOperationCount =1;    // 线程依赖    [operation1 addDependency:operation];    [operation2 addDependency:operation1];    // 可以在不同队列之间设置依赖    [queue addOperation:operation];    [queue addOperation:operation1];    [queue addOperation:operation2];



NSOperation任务监听:

    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{        for (int i=0; i<10; i++) {
    // 切记, 此地是同步, 一定要注意, 如果这个地方使用了第三方的网络操作(他们默认已经异步了, 这个必须要注意): 
    // 例如 AFNetWorking Aliyun OSS 实际应用中这个地方要特别注意  
            NSLog(@"=======下载图片====%@", [NSThread currentThread]);
        }    }];    operation.completionBlock = ^{        NSLog(@"=======下载图片完毕====%@", [NSThread currentThread]);    };    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    [queue addOperation:operation];



自定义NSOperation

自定义NSOperation其实就是 继承NSOperation 写一些自己使用的扩展, 比如: 图片下载.

自定义非并发的NSOpetation

  • 自定义的串行NSOperation,必须重写main方法, 并且在main方法中实现下载操作
  • 默认情况下,你必须重写这个方法. 并且他会给你生成自动释放池


NSOperation图片下载的流程:


并发的NSOperation

如果要创建并发操作,则需要至少覆盖以下方法和属性
  • start
  • asynchronous
  • executing
  • finished

  • start
  • asynchronous
  • executing
  • finished
  • 1 0
    原创粉丝点击