iOS之[多线程:NSOperation]

1. NSOperation

:fa-exclamation-triangle:如下是你须要考虑使用 NSOperation 的一些理由:并发

1.当你须要取消线程任务时,GCD 没法提供取消任务的操做。而 NSOperation 提供了取消任务的操做;异步

2.当你须要更细的粒度地观察任务改变了状态时,因为 NSOperation 是一个对象,比较 GCD 使用的 block 而言,经过对 NSOperation 对象进行键值观察(KVO)能很容易观察到任务的状态改变;spa

3.当你须要重用线程任务时,NSOperation 做为一个普通的 Objective-C 对象,能够存储任何信息。对象就是为重用而设计的,这时,NSOperation 比 GCD 使用的 block 要更方便。.net

1.1 NSOperation简介

实际开发中使用的是NSOperation的两个子类线程

- NSInvocationOperation
    - NSBlockOperation        :使用block形式组织代码,相对方便
1.2 线程的建立执行过程
异步:建立NSOperation -> 建立NSOperationQueue队列 -> 将NSOperation添加到Queue中

同步:建立NSOperation -> 调用start方法
1.3 线程状态
isReady     :准备就绪 -> 只读(有线程依赖时可能为NO)
isExecuting :正在执行 -> 只读
isFinished  :执行完了 -> 只读
isCancelld  :已经取消 -> 能够手动干预:调用cancel()方法
    - 只是设置队列状态,并非真正的中止当前队列
1.4线程优先级:queuePriority

线程优先级分为5个级别设计

@property double threadPriority; //IOS8已废弃
@property NSOperationQueuePriority queuePriority;

typedef NS_ENUM(NSInteger, NSOperationQueuePriority) {
	NSOperationQueuePriorityVeryLow = -8L,
	NSOperationQueuePriorityLow = -4L,
	NSOperationQueuePriorityNormal = 0,
	NSOperationQueuePriorityHigh = 4,
	NSOperationQueuePriorityVeryHigh = 8
};
1.5设置依赖线程

A依赖于B:B执行完以后,才能执行A 添加依赖code

- (void)addDependency:(NSOperation *)op;

删除依赖orm

- (void)removeDependency:(NSOperation *)op;
1.6 添加执行完毕监听
operation.completionBlock = ^(){
    //执行完毕
};

- (void)waitUntilFinished;

2.NSOperationQueue

  • 负责管理/执行全部的NSOperation对象

  • 可以更加容易的管理线程总数,控制线程之间的依赖关系blog

2.1在队列中添加操做
- (void)addOperation:(NSOperation *)op;

- (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait;

- (void)addOperationWithBlock:(void (^)(void))block;
2.2设置最大线程数
queue.maxConcurrentOperationCount = ?
2.3取消队列中全部线程
- (void)cancelAllOperations;
2.4执行完了监听
- (void)waitUntilAllOperationsAreFinished;
2.5调用主线程队列:更新UI
[[NSOperationQueue mainQueue] addOperation...];

3.NSInvocationOperation

建立线程:

- (instancetype)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;
- (instancetype)initWithInvocation:(NSInvocation *)inv;

例子:

//建立操做
NSInvocationOperation *invocationOpr = 
        [[NSInvocationOperation alloc] initWithTarget:self 
                                             selector:@selector(load) 
                                               object:nil];

//建立队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

//添加到队列,队列回开启一个线程执行此操做
[queue addOperation : invocationOpr];

4.NSBlockOperation

建立线程

+ (instancetype)blockOperationWithBlock:(void (^)(void))block;

//在已有的线程的基础上,添加其余线程:并发
- (void)addExecutionBlock:(void (^)(void))block;

例子:

方法一:建立操做并添加到队列
    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
        
    }];

    //建立队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    //添加到队列
    [queue addOperation : block];

方法二:直接添加操做到队列
    //建立队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperationWithBlock:^{
        
    }];

=========================================================

其余线程方式:

NSThread http://my.oschina.net/u/2462423/blog/534210

GCD:Dispatch http://my.oschina.net/u/2462423/blog/534159

相关文章
相关标签/搜索