NSOperation、NSOperationQueue

- (void)operationTS{
    //NSOperation 单独使用时系统同步执行操作,配合 NSOperationQueue 我们能更好的实现异步执行。
    /***************** NSInvocationOperation ********************/
    NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil];
    [op start];
    
    /******************** NSBlockOperation **********************/
    //addExecutionBlock: 就可以为 NSBlockOperation 添加额外的操作。这些操作(包括 blockOperationWithBlock 中的操作)可以在不同的线程中同时(并发)执行
    NSBlockOperation *blockOP = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"NSBlockOperation执行");
    }];
    
    [blockOP addExecutionBlock:^{
        NSLog(@"NSBlockOperation额外添加任务1");
    }];
    [blockOP addExecutionBlock:^{
        NSLog(@"NSBlockOperation额外添加任务2");
    }];
    [blockOP addExecutionBlock:^{
        NSLog(@"NSBlockOperation额外添加任务3");
    }];
    [blockOP start];
    
    /******************** NSOperation子类 **********************/
    KZOperation *kzOP = [[KZOperation alloc]init];
    [kzOP start];

}

- (void)operationQueue{
    /*
     对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性)
     */
    
    //主队列、自定义队列(串行、并发)
    //maxConcurrentOperationCount(6-max 默认-1)
    //可控制并发(开启线程数量是由系统决定)、串行
    
    //主队列获取方法
    NSOperationQueue *queueMain = [NSOperationQueue mainQueue];
    //自定义队列创建方法
    //添加到这种队列中的操作,就会自动放到子线程中执行。
    //同时包含了:串行、并发功能。
    NSOperationQueue *queueZi = [[NSOperationQueue alloc]init];
    
    /**************** 操作加入到队列中 ********************/
    //- (void)addOperation:(NSOperation *)op;
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task) object:nil];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"任务3");
    }];
    [op3 addExecutionBlock:^{
        NSLog(@"任务4");
    }];
    [queue addOperation:op1];
    [queue addOperation:op2];
    [queue addOperation:op3];
    
    //- (void)addOperationWithBlock:(void (^)(void))block;
    [queue addOperationWithBlock:^{
        NSLog(@"任务5");
    }];
    
    /*************** queuePriority优先级 *************/
    //仅适用于同一操作队列中的操作
  
   /*
    如果一个队列中既包含高优先级操作,又包含低优先级操作,并且两个操作都已经准备就绪,那么队列先执行高优先级操作。
    如果,一个队列中既包含了准备就绪状态的操作,又包含了未准备就绪的操作,未准备就绪的操作优先级比准备就绪的操作优先级高。那么,虽然准备就绪的操作优先级低,也会优先执行。优先级不能取代依赖关系。如果要控制操作间的启动顺序,则必须使用依赖关系。
    */
    
    /****************** 线程间通信 *****************/
    NSOperationQueue *queue001 = [[NSOperationQueue alloc]init];
    [queue001 addOperationWithBlock:^{
        NSLog(@"异步任务");

        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            NSLog(@"回到主线程");
        }];
    }];
    
    /***************** 线程安全 *****************/
    /*
     可以给线程加锁,在一个线程执行该操作的时候,不允许其他线程进行操作。iOS 实现线程加锁有很多种方式。@synchronized、 NSLock、NSRecursiveLock、NSCondition、NSConditionLock、pthread_mutex、dispatch_semaphore、OSSpinLock、atomic(property) set/ge等等各种方式
     */
    
    
    /*************** NSOperation常用属性及方法归纳 *******************/
    /*
     取消操作方法
     - (void)cancel; 可取消操作,实质是标记 isCancelled 状态。
     判断操作状态方法
     - (BOOL)isFinished; 判断操作是否已经结束。
     - (BOOL)isCancelled; 判断操作是否已经标记为取消。
     - (BOOL)isExecuting; 判断操作是否正在在运行。
     - (BOOL)isReady; 判断操作是否处于准备就绪状态,这个值和操作的依赖关系相关。
     操作同步
     - (void)waitUntilFinished; 阻塞当前线程,直到该操作结束。可用于线程执行顺序的同步。
     - (void)setCompletionBlock:(void (^)(void))block; completionBlock 会在当前操作执行完毕时执行 completionBlock。
     - (void)addDependency:(NSOperation *)op; 添加依赖,使当前操作依赖于操作 op 的完成。
     - (void)removeDependency:(NSOperation *)op; 移除依赖,取消当前操作对操作 op 的依赖。
     @property (readonly, copy) NSArray<NSOperation *> *dependencies; 在当前操作开始执行之前完成执行的所有操作对象数组。
     */
    
    
    /************** NSOperationQueue 常用属性和方法 *****************/
    /*
     取消/暂停/恢复操作
     - (void)cancelAllOperations; 可以取消队列的所有操作。
     - (BOOL)isSuspended; 判断队列是否处于暂停状态。 YES 为暂停状态,NO 为恢复状态。
     - (void)setSuspended:(BOOL)b; 可设置操作的暂停和恢复,YES 代表暂停队列,NO 代表恢复队列。
     操作同步
     - (void)waitUntilAllOperationsAreFinished; 阻塞当前线程,直到队列中的操作全部执行完毕。
     添加/获取操作`
     - (void)addOperationWithBlock:(void (^)(void))block; 向队列中添加一个 NSBlockOperation 类型操作对象。
     - (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; 向队列中添加操作数组,wait 标志是否阻塞当前线程直到所有操作结束
     - (NSArray *)operations; 当前在队列中的操作数组(某个操作执行结束后会自动从这个数组清除)。
     - (NSUInteger)operationCount; 当前队列中的操作数。
     获取队列
     + (id)currentQueue; 获取当前队列,如果当前线程不是在 NSOperationQueue 上运行则返回 nil。
     + (id)mainQueue; 获取主队列。
     
    
     */
     
}


- (void)task{
    NSLog(@"任务执行");
}

  创建继承自NSOperation的子类,并重写main方法

@interface KZOperation : NSOperation

@end

@implementation KZOperation
- (void)main{
    if (!self.isCancelled) {
        NSLog(@"KZOperation继承NSOperation");
    }
}
@end

 

posted @ 2018-06-07 11:03  hongsheng  阅读(119)  评论(0编辑  收藏  举报