美文网首页
多线程(NSOperation)

多线程(NSOperation)

作者: JS_swh | 来源:发表于2017-03-20 18:06 被阅读0次

基本使用

  • NSInvocationOperation
    NSInvocationOperation op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];
    // 创建队列
    /

    GCD:
    串行类型: create & 主队列
    并发类型: create & 全局并发队列
    NSOperation:
    主队列(串行队列): [NSOperationQueue MainQueue] 和 GCD主队列一样
    非主队列: [[NSOperationQueue alloc] init] 非常特殊(同时具备并发和串行的功能) (默认情况下是并发队列)
    */
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 将操作添加到队列中
    [queue addOperation:op]; // 内部已经调用了start方法

  • NSBlockOperation
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    }];
    // 追加任务 (一个操作对象包含一个以上任务 可能会开启子线程并发执行任务)
    [op addExecutionBlock:^{
    }];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op];

      // 简便方法
      [queue addOperationWithBlock:^{
      
      }];
    
  • 自定义NSOperation
    // 自定义操作类继承自NSOperation 重写main方法
    #import "SWOperation.h"
    @implementation SWOperation
    // 要执行的任务
    -(void)main
    {
    }
    @end

    // 调用该自定义操作类 即可实现并发操作 
    SWOperation *op = [[SWOperation alloc] init];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:op];
    

NSOperation其他用法(暂停/恢复/取消/最大并发数)

  • 最大并发数(默认值为-1,表示最大值)
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 最大并发数(同一时间最多有多少个任务可以执行) 并发数为1时为串行执行(注:串行不代表只开一条线程)
    queue.maxConcurrentOperationCount = 1;

  • 暂停/恢复/取消
    // 暂停 (不能暂停当前正在执行的任务 暂停后队列中未执行的任务会停止执行)
    queue.suspended = YES;
    // 恢复
    queue.suspended = NO;
    // 取消
    [queue cancelAllOperations];

    // 自定义类的暂停/恢复/取消
    #import "SWOperation.h"
    @implementation SWOperation
    // 要执行的任务
    -(void)main
    {
       for (int i = 0; i < 1000; i++) {
            NSLog(@"download1---%d---%@",i,[NSThread mainThread]);
       }
       // 点击取消 会自动调用cancel方法 判断是否取消 若取消 则退出
       if (self.isCancelled) {
           return;
       }
       for (int i = 0; i < 1000; i++) {
           NSLog(@"download1---%d---%@",i,[NSThread mainThread]);
       }
    }
    @end
    
  • 操作依赖
    // 操作1依赖于操作2 (不能循环依赖)
    // 可以跨队列依赖
    [op1 addDependency:op2];

  • 操作监听
    // 操作监听
    [op1 setCompletionBlock:^{
    // op1操作执行完毕
    }];

NSOperation线程间通讯

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
    // 执行耗时操作
    // 回主线程更新UI
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        // 更新UI
    }];
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op];

相关文章

网友评论

      本文标题:多线程(NSOperation)

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