六、线程管理————NSOperation

mac2022-06-30  122

1、NSOperation的作用以及特点                (1)是OC语言中基于GCD的面向对象的封装,NSOperation是iOS2.0推出的,iOS4之后(GCD出现)重写了NSOperation。                (2)使用起来比GCD更加简单(面向对象)。同时,苹果推荐使用,使用NSOperation不用关心线程以及线程的生命周期。                (3)提供了一些用GCD不好实现的功能,比如暂停,取消,最大并发数、依赖关系。当然GCD也有自己的特有,比如延迟、一次性执行、调度组。                (4)NSOperation是抽象类,约束子类都具有共同的属性和方法,不能直接使用,而是使用其子类。                (5)任务是并发执行的,除非遇到主队列(不是通过start命令执行任务的那种情况)。                2、NSOperationQueue 队列(1)两种队列    并发队列:程序员自己创建    主队列:系统创建(2)NSOperationQueue的作用:    NSOperation可以调用start方法来执行任务,但默认是同步执行的。如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作。(3)无论是使用start还是加入队列的方式来执行操作,系统都会调用NSOperation中的main方法。(4)添加操作到队列(主队列也一样)                - (void)addOperation:(NSOperation *)op;        - (void)addOperationWithBlock:(void (^)(void))block;         (5)其他一些方法和属性                (BOOL)suspended  暂停        operationCount 队列中的操作数        maxConcurrentOperationCount 最大并发数        +mainQueue 获得主队列        +currentQueue 获得当前队列        -cancelAllOperations 取消所有操作                                        3、NSOperation子类——NSInvocationOperation                (1)实例                //建NSInvocationOperation对象        - (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;        //调用start方法开始执行操作,一旦执行操作,就会调用target的sel方法        - (void)start;    (2)注意:默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作,只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作。                               4、NSOperation子类——NSBlockOperation        (1)实例:                        //创建NSBlockOperation对象        + (id)blockOperationWithBlock:(void (^)(void))block;        //通过addExecutionBlock:方法添加更多的操作        - (void)addExecutionBlock:(void (^)(void))block;        (2)注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作        5、并发数(1)定义:同时执行的任务数,比如,同时开3个线程执行3个任务,并发数就是3。(2)最大并发数及相关方法:最大并发数是系统同一时间并发执行任务的最大数。系统可以开辟多个线程和队列可以拥有多个任务,但是同时执行的只能是执行设定好的最大并发数的任务,直到队列中任务执行完毕。        - (NSInteger)maxConcurrentOperationCount;        - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;(3)执行的过程        a、把操作添加到队列        b、去线程池去取空闲的线程,如果没有就创建线程        c、把操作交给从线程池中取出的线程执行        d、执行完成后,把线程再放回线程池中        e、重复b,c,d直到所有的操作都执行完        6、优先级    1、方法一:设置NSOperation在queue中的优先级,可以改变操作的执行优先级,注意这是NSOperation中的属性。- (NSOperationQueuePriority)queuePriority;- (void)setQueuePriority:(NSOperationQueuePriority)p;2、方法二:iOS8以后推荐使用服务质量 qualityOfService属性,这是个枚举值。3、注意:优先级只是告诉系统:在并发执行的情况下,请尽量优先调用优先级高的任务去执行,并不能绝对保证CPU全部执行优先级高的任务。7、依赖关系(1)定义:NSOperation之间可以设置依赖来保证执行顺序。(2)实例    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"op1 验证账号");    }];        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"op2 扣费");    }];    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{        NSLog(@"op3 下载应用");    }];    //操作依赖 不能设置相互依赖    [op2 addDependency:op1];    [op3 addDependency:op2];    //把操作添加到队列中 waitUntilFinished是否等待这句代码执行完毕再来执行下面的代码    [self.queue addOperations:@[op2,op3] waitUntilFinished:NO];        //不同的队列之间也可以设置依赖关系    [[NSOperationQueue mainQueue]addOperation:op1];8、监听操作的完成(1)类似于GCD的操作组,NSOperation也可以监听操作的完成,这是NSOperation种的方法:- (void (^)(void))completionBlock;- (void)setCompletionBlock:(void (^)(void))block;

转载于:https://www.cnblogs.com/David-SU/p/5274388.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)