iOS开发之NSOperation

一、NSOperation基本概念

NSOperation是我们在开发中常用的多线程处理的手段之一,其实NSOperation是对GCD的包装,它的两个核心概念是【队列+操作】。

二、NSOperation常用方法

NSOperation本身就是一个抽象类,只能使用它的子类,常用的三个子类分别是:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类。通过利用NSOperation和NSOperationQueue结合使用实现多线程并发。三种用法举例说明:
- (void)viewDidLoad {
    [super viewDidLoad];
    -----------------------------NSInvocationOperation--------------------------------
    //实例化一个线程操作对象
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomthing:) object:nil];
    //设置如果线程执行完毕以后,回调的block函数
    [op1 setCompletionBlock:^{
        NSLog(@"op1执行完毕");
    }];
    //设置优先级
    op1.queuePriority = NSOperationQueuePriorityVeryLow;
    
-----------------------------NSBlockOperation--------------------------------
    //带block的NSOperation
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        //线程需要执行的代码
        NSLog(@"op2正在执行");
    }];
    
    [op2 setCompletionBlock:^{
        NSLog(@"op2执行完毕");
    }];
    
-----------------------------继承NSOperation的自定义类------------------------------
    //MyOperation 是继承NSOperation的自定义类,里面实现了这样一个函数-(void)main{NSLog(@"MyOperation执行中...");}
    MyOperation *op3 = [MyOperation new];
    [op3 setCompletionBlock:^{
        NSLog(@"op3执行完毕");
    }];
    //设置优先级
    op3.queuePriority = NSOperationQueuePriorityVeryHigh;
    
    //添加到线程池(队列)
    NSOperationQueue *queue = [NSOperationQueue new];
    //只允许开启一个线程
    //此时会变成串行任务
    queue.maxConcurrentOperationCount = 1;
    
    //添加到线程池之后,就会自动开启线程,默认是并发执行任务
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
}

-(void)doSomthing:(id)sender{
    NSLog(@"op1正在执行");
}
三、队列的取消,暂停和恢复

 (1)取消队列的所有操作

 - (void)cancelAllOperations;

提⽰:也可以调用NSOperation的- (void)cancel⽅法取消单个操作

 (2)暂停和恢复队列

- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

- (BOOL)isSuspended; //当前状态

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

猜你喜欢

转载自www.cnblogs.com/laolitou-ping/p/12787003.html