美文网首页
iOS NSOperation

iOS NSOperation

作者: 青椒辣不辣 | 来源:发表于2020-12-11 11:54 被阅读0次

    \color{rgb(0 ,139, 139)}{操作 NSOperation}NSInvocationOperation,NSBlockOperation,自定义

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSInvocationOperation *iOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];
        [iOp start];
    
        NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"NSBlockOperation----%@",[NSThread currentThread]);
        }];
        //追加任务Execution执行  当一个操作中的任务数据大于1的时候,就会开子线程并发执行任务
        [bOp addExecutionBlock:^{
            NSLog(@"NSBlockOperation_addExecutionBlock----%@",[NSThread currentThread]);
        }];
        [bOp start];
    
        RJOperation *rjOp = [[RJOperation alloc]init];
        [rjOp start];
    }
    -(void)download{
        NSLog(@"NSInvocationOperation----%@",[NSThread currentThread]);
    }
    
    NSInvocationOperation----<NSThread: 0x60000239c980>{number = 1, name = main}
    NSBlockOperation----<NSThread: 0x60000239c980>{number = 1, name = main}
    NSBlockOperation_addExecutionBlock----<NSThread: 0x6000023d11c0>{number = 4, name = (null)}
    2020-12-11 11:17:42.582228+0800 RJCustomTool[3797:101929] RJOperation----<NSThread: 0x60000239c980>{number = 1, name = main}
    2020-12-11 11:17:46.582409+0800 RJCustomTool[3797:101929] -[RJOperation dealloc]
    
    

    RJOperation

    #import <Foundation/Foundation.h>
    NS_ASSUME_NONNULL_BEGIN
    @interface RJOperation : NSOperation
    @end
    NS_ASSUME_NONNULL_END
    
    
    #import "RJOperation.h"
    @implementation RJOperation
    -(void)main{
        NSLog(@"RJOperation----%@",[NSThread currentThread]);
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            //4秒过后取消线程
            [self cancel];
        });
    }
    -(void)dealloc{
        NSLog(@"%s",__func__);
    }
    @end
    
    

    \color{rgb(0 ,139, 139)}{操作 + 队列NSOperationQueue}

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        
        NSInvocationOperation *iOp = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download) object:nil];
        
        NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"NSBlockOperation----%@",[NSThread currentThread]);
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"addOperationWithBlock----%@",[NSThread currentThread]);
        }];
    
        RJOperation *rjOp = [[RJOperation alloc]init];
        
        [queue addOperation:iOp];
        [queue addOperation:bOp];
        [queue addOperation:rjOp];
    }
    -(void)download{
        NSLog(@"NSInvocationOperation----%@",[NSThread currentThread]);
    }
    
    addOperationWithBlock----<NSThread: 0x600003cfee00>{number = 3, name = (null)}
    NSBlockOperation----<NSThread: 0x600003cfc840>{number = 4, name = (null)}
    NSInvocationOperation----<NSThread: 0x600003ce5c40>{number = 9, name = (null)}
    2020-12-11 11:30:27.381186+0800 RJCustomTool[3998:115346] RJOperation----<NSThread: 0x600003cfee00>{number = 3, name = (null)}
    2020-12-11 11:30:31.381343+0800 RJCustomTool[3998:115106] -[RJOperation dealloc]
    
    

    \color{rgb(0 ,139, 139)}{取消|暂停|恢复}队列中的任务是有状态的:暂停和取消操作不能作用于当前正处于运行状态的操作

        [queue setSuspended:YES];//暂停
        [queue setSuspended:NO];//恢复
        [queue cancelAllOperations];//取消
    
    
    /*
        设置最大并发数量
        maxConcurrentOperationCount 最大并发数:同一时间最多可以处理的任务数量
        队列默认是并发队列
        maxConcurrentOperationCount == 1 串行队列
        -1 在计算机 中表示的是最大值(默认是不受限制的)*/
        queue.maxConcurrentOperationCount = -1;
    

    \color{rgb(0 ,139, 139)}{操作依赖}不能设置循环依赖(死锁-不会执行)

        [iOp addDependency:rjOp];
        [rjOp addDependency:bOp];
    
    NSBlockOperation----<NSThread: 0x600000870cc0>{number = 7, name = (null)}
    2020-12-11 11:36:44.313473+0800 RJCustomTool[4085:121948] RJOperation----<NSThread: 0x600000870cc0>{number = 7, name = (null)}
    NSInvocationOperation----<NSThread: 0x600000870cc0>{number = 7, name = (null)}
    2020-12-11 11:36:48.313641+0800 RJCustomTool[4085:121654] -[RJOperation dealloc]
    

    \color{rgb(0 ,139, 139)}{线程间通信}

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        [queue addOperationWithBlock:^{
            NSLog(@"OperationQueue----%@",[NSThread currentThread]);
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                NSLog(@"UI----%@",[NSThread currentThread]);
            }];
        }];
    
    OperationQueue----<NSThread: 0x60000204afc0>{number = 7, name = (null)}
    UI----<NSThread: 0x600002024a40>{number = 1, name = main}
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    \color{rgb(0 ,139, 139)}{}``

    
    

    相关文章

      网友评论

          本文标题:iOS NSOperation

          本文链接:https://www.haomeiwen.com/subject/rpprgktx.html