美文网首页
iOS多线程笔记3--NSOperation

iOS多线程笔记3--NSOperation

作者: rookiesss | 来源:发表于2018-12-06 16:29 被阅读0次

    1.GCD & NSOperation:
    GCD是在ios 4.0推出,主要针对多核处理器做了优化的并发技术,是C语言开发的。
    — 将任务[block]添加到队列[串行/并发/主队列/全局队列],并且制定执行任务的函数[同步/异步]
    — 线程间通讯 dispatch_get_main_queue、dispatch_get_global_queue
    — NSOperation不具备的功能:
    一次执行、延时执行等。

    NSOperation 是 ios 2.0 推出的 ,GCD出现后是对GCD的封装。
    — 将操作[异步执行的任务] 添加到队列[并发队列],就会立刻异步执行。
    — 线程间通讯 mainQueue
    — 能实现GCD实现困难的功能:
    ——— 最大并发线程
    ——— 队列的暂停、继续
    ——— 取消所有操作
    ——— 制定操作之间的依赖关系(GCD只有使用同步锁来实现)
    2.NSOperation是一个抽象类,不用直接使用,NSOperation是对GCD的封装。
    NSOperation属性:
    -(void)start; //启动NSOperation的main方法任务。

    -(BOOL)isConcurrent; 是否是并发执行

    -(void)main; //定义主要任务

    -(BOOL)isCancelled; //当前任务状态是否已标记为取消

    -(void)cancel; //取消当前任务

    -(BOOL)isExecuting; //任务是否在运行

    -(BOOL)isFinished; //任务是否已结束

    NSOperation其它常用方法,包括依赖关系:

    -(BOOL)isReady; //是否能准备运行,这个值和任务的依赖关系相关

    -(void)addDependency:(NSOperation *)op; //加上任务的依赖,也就是说依赖的任务都完成后,才能执行当前任务

    -(void)removeDependency:(NSOperation *)op; //取消任务的依赖,依赖的任务关系不会自动消除,必须调用该方法

    -(NSArray *)dependencies; //得到所有依赖的NSOperation任务

    以及用于任务同步:

    -(void)waitUntilFinished; //阻塞当前线程,直到该NSOperation结束。可用于线程执行顺序的同步

    -(void)setCompletionBlock:(void (^)(void))block; //设置NSOperation结束后运行的block代码,由于NSOperation有可能被取消,所以这个block运行的代码应该和NSOperation的核心任务无关。

    除了继承NSOperation来实现并发代码,通常更简便的办法是使用它的两个子类NSInvocationOperation或NSBlockOperation,然后加入到NSOperationQueue执行队列中去运行。部分示例代码如下:

    NSInvocationOperation *opA = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(selector) object:nil];
    NSBlockOperation *opB = [NSBlockOperation blockOperationWithBlock:^{
        }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = 2; //设置最大并发执行数,如果为1则同时只有一个并发任务在运行,可控制顺序执行关系
    [queue addOperation:opA]; //加入到执行队列中,如果isReady则开始执行
    [queue addOperation:opB]; //同上,需要注意这时opA和opB是在并发运行
    [queue waitUntilAllOperationsAreFinished]; //当前线程等待,直到opA和opB都执行结束
    如果要求opB在opA执行完成后才开始执行,需要加上依赖关系即可:
    [opB addDependency:opA];
    当然也可以使用同步方法waitUntilFinished,在前面的例子中加入:
    
    NSBlockOperation *opB = [NSBlockOperation blockOperationWithBlock:^{
       [opA waitUntilFinished]; //opB线程等待直到opA执行结束(正常结束或被取消
            [self operate];
        }];
    

    建立依赖关系或等待关系,一定要出现避免循环依赖或循环等待,否则就会造成线程死锁。

    NSOperationQueue的其它常用方法:

    -(void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; //批量加入执行operation,wait标志是否当前线程等待所有operation结束后,才返回

    -(void)addOperationWithBlock:(void (^)(void))block; //相当于加入一个NSBlockOperation执行任务

    -(NSArray *)operations; //返回已加入执行operation的数组,当某个operation结束后会自动从这个数组清除

    -(NSUInteger)operationCount //返回已加入执行operation的数目

    -(void)setSuspended:(BOOL)b; //是否暂停将要执行的operation,但不会暂停已开始的operation

    -(BOOL)isSuspended; //返回暂停标志

    -(void)cancelAllOperations; //取消所有operation的执行,实质是调用各个operation的cancel方法

    +(id)currentQueue; //返回当前NSOperationQueue,如果当前线程不是在NSOperationQueue上运行则返回nil

    +(id)mainQueue; //返回主线程的NSOperationQueue,缺省总是有一个queue

    属性以及方法来自这里

    相关文章

      网友评论

          本文标题:iOS多线程笔记3--NSOperation

          本文链接:https://www.haomeiwen.com/subject/tptqpftx.html