zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    pass cloudcc
    eclipse生成javaDoc时,出现"编码GBK 的不可映射字符"
    tabWidget 直布局
    用 Navicat for Oracle 管理 Oracle10g/11g 数据库
    Aspx页面内 成员变量丢失的问题
    AspNet2.0页面生命周期
    【Z】浅析豆瓣的 Google Analytics 应用
    绑定SqlDataSource的Gridview字符串字段长度截取(转)
    Java web 推荐书籍
    关于Reapeter的总结
  • 原文地址:https://www.cnblogs.com/whongs/p/9149561.html
Copyright © 2011-2022 走看看