zoukankan      html  css  js  c++  java
  • IOS多线程--NSOperationNSOperationQueue

    iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术

        1.GCD是纯C的,对面向对象的程序员不友好

        2.GCD对编程管理还不是很强大

        NSOperation 其实底层实现是基于GCD来做的

        dispatch_queue_t ==  NSOperationQueue

        dispatch_async == NSOperation

        dispatch_sync  == NSOperation

        NSOperation是个抽象类

        使用它的两个子类

        NSInvocationOperation

        NSBlockOperation

    默认是在主线程上执行,会阻塞主线程

    1.申请一个任务(self 响应的eat方法)

    NSInvocationOperation *iop = [[NSInvocationOperation alloc]initWithTarget

      执行任务 [iop start];

    2.block任务,直接使用,默认也是主线程

    (1)addExecutionBlock能够实现并发执行,有新线程产生

         NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{

    ¥如果创建时没有执行任务、用addExecutionBlock添加的第一个任务也是主线程执行的、第二个才是新线程、

    (2)添加执行block

    [bop addExecutionBlock:^{

    (3)完成任务给个回调、回调后面的便不再执行、不往下走了

    bop.completionBlock = ^{

    但是、start还是执行的、start必须存在、不然整个NSBlockOperation都不执行

    这些任务都是在start之前执行的

        执行任务[bop start];

    NSOperationQueue管理任务

    1、一旦把任务交给队列管理、任务就是并发的

    2、任务都是在子线程中完成的

    3、不需要调用start方法、自动就会执行

    (1)创建 alloc init

    (2)在同一时刻并发执行的最大数量,这一点就完胜GCD,需要在添加任务之前设定 

    queue.maxConcurrentOperationCount = 2;

    (3)把任务交给队列管理

    [queue addOperation:iop1];

        [queue addOperation:iop2];

    或者

    参数:waitUntilFinished是否等待队列任务都完成后 再往后执行

        [queue addOperations:@[iop2,iop1] waitUntilFinished:NO];

    控制NSOperationQueue顺序

    可一个给任务添加依赖关系、相当于间接的设定了任务的顺序(串行)

    (1)依赖关系必须添加到任务提交之前

    [iop1 addDependency:iop2];(iop1依赖于iop2,那么2先,1后)

    (2)挂起主线程,等待所有的任务都完成,主线程才能继续执行,只要有没完成的,方法就不返回

    [queue waitUntilAllOperationsAreFinished];

    ¥waitUntilFinished:NO  和   waitUntilAllOperationsAreFinished

    都是控制主线程也就是NSOperationQueue之外的任务是否立即执行还是等待队列中任务完成后执行

    (3)暂停

    [self.queue setSuspended:YES];

    1.正在执行的任务不会受暂停影响

        2.只有还没执行的任务才能被操控

        3.NSOperationQueue默认是并发的,需要设置依赖关系才能出现没执行的任务,才能做暂停操控

    (4)继续

    [self.queue setSuspended:NO];

    (5)只能取消未执行的任务,取消后不能继续

    [self.queue cancelAllOperations];

  • 相关阅读:
    Demo:刮刮卡橡皮擦效果
    养成良好的代码编写习惯
    我的百科
    专业英语词汇
    加载资源的类
    循环滚动翻页+居中项缩放
    学习笔记—Node中模块化规范
    学习笔记—Node中的EventLoop
    学习笔记—Node的全局对象
    学习笔记—Node的基本概念
  • 原文地址:https://www.cnblogs.com/gaduo/p/4996561.html
Copyright © 2011-2022 走看看