美文网首页
iOS多线程-NSOperation基本操作

iOS多线程-NSOperation基本操作

作者: 学习天亦 | 来源:发表于2019-06-02 22:28 被阅读0次

    复习下线程的基础知识, 这里主要是参考文顶顶多线程篇复习写的。

    一、并发数

    (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3
    (2)最大并发数:同一时间最多只能执行的任务的个数。
    (3)最⼤大并发数的相关⽅方法

    - (NSInteger)maxConcurrentOperationCount;
    - (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 
    

    说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内存少就开少一点。
    提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。

    二、队列的取消,暂停和恢复

    (1)取消队列操作

    - (void)cancelAllOperations;//队列取消所有操作
    
    - (void)cancel;// 操作取消
    

    (2)暂停和恢复队列

    - (void)setSuspended:(BOOL)bool; // YES代表暂停队列,NO代表恢复队列
    - (BOOL)isSuspended; //当前状态
    

    (3)暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。

    三、操作优先级

    (1)设置NSOperation在queue中的优先级,可以改变操作的执⾏优先级

    - (NSOperationQueuePriority)queuePriority;
    - (void)setQueuePriority:(NSOperationQueuePriority)p;
    

    (2)优先级的取值

    NSOperationQueuePriorityVeryLow = -8L,
    NSOperationQueuePriorityLow = -4L,
    NSOperationQueuePriorityNormal = 0,
    NSOperationQueuePriorityHigh = 4,
    NSOperationQueuePriorityVeryHigh = 8 
    

    说明:优先级高的任务,调用的几率会更大。

    4、操作的监听

    可以监听一个操作的执行完毕

    - (void (^)(void))completionBlock;
    - (void)setCompletionBlock:(void (^)(void))block;
    

    5、操作的依赖

    (1) NSOperation之间可以设置依赖来保证执行顺序
    比如一定要让操作A执行完后,才能执行操作B,可以这么写

    [operationB addDependency:operationA]; // 操作B依赖于操作A
    

    (2)可以在不同queue的NSOperation之间创建依赖关系


    (3)代码示例

    #import "ViewController.h"
    @interface ViewController ()
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self dependency];
    }
    
    - (void)dependency {
        /**
         假设有A、B、C三个操作,要求:
         1. 3个操作都异步执行
         2. 操作C依赖于操作B
         3. 操作B依赖于操作A
         */
        // 1.创建一个队列(非主队列)
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 2.创建3个操作
        NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"A1---%@", [NSThread currentThread]);
        }];
        [operationA addExecutionBlock:^{
            NSLog(@"A2---%@", [NSThread currentThread]);
        }];
        
        [operationA setCompletionBlock:^{
            NSLog(@"AAAAA---%@", [NSThread currentThread]);
        }];
        
        NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"B---%@", [NSThread currentThread]);
        }];
        NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"C---%@", [NSThread currentThread]);
        }];
        
        // 设置依赖
        [operationB addDependency:operationA];
        [operationC addDependency:operationB];
        
        // 3.添加操作到队列中(自动异步执行任务)
        [queue addOperation:operationC];
        [queue addOperation:operationA];
        [queue addOperation:operationB];
    }
    
    

    A做完再做B,B做完才做C。
    注意:一定要在添加之前,进行设置。
    提示:任务添加的顺序并不能够决定执行顺序,执行的顺序取决于依赖。使用Operation的目的就是为了让开发人员不再关心线程。

    相关文章

      网友评论

          本文标题:iOS多线程-NSOperation基本操作

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