iOS多线程之NSOperation

来源:互联网 发布:java程序设计基础答案 编辑:程序博客网 时间:2024/05/28 05:17

NSOperation是基于GCD的一个封装. 但是比GCD多了一些简单实用的功能, 这就使NSOperation变的更加的面向对象.
NSOperation是一个抽象基类,我们使用最多的是它的子类NSInvocationOperation和NSBlockOperation。

1.同步异步,线程之间的传递信息

 //NSOperationQueue 有两种队列,主队列,自定义    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];  //主队列    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列    //(1)主线程实现任务(同步,没意义)    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runner) object:nil];    [operation start];-(void)runner{  NSLog(@"当前的线程 %@", [NSThread currentThread]);}
 //(2)NSInvocationOperation异步实现    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(runner) object:nil];   //当把operation放大queue的时候,系统会自动创建异步并发队列。    [queue addOperation:operation];-(void)runner{    self.lable.text =@"20";    NSLog(@"当前的线程 %@", [NSThread currentThread]);    // 2.回到主线程更新UI    [[NSOperationQueue mainQueue] addOperationWithBlock:^{        self.lable.text =@"100";        NSLog(@"当前的线程 %@", [NSThread currentThread]);    }];   }
 //(3)NSBlockOperation    self.lable.text =@"20";    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){        sleep(2.0);        NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);        // 2.回到主线程,可以刷新UI        [[NSOperationQueue mainQueue] addOperationWithBlock:^{            self.lable.text =@"100";            NSLog(@"当前的线程 %@", [NSThread currentThread]);        }];    }];    [queue addOperation:operation1];
 //(4)NSOperationQueue 添加一个block形式的Operation    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    self.lable.text =@"20";    [queue addOperationWithBlock:^{        sleep(2.0);        // 1.执行一些比较耗时的操作        NSLog(@"group-1当前的线程 %@", [NSThread currentThread]);        // 2.回到主线程        [[NSOperationQueue mainQueue] addOperationWithBlock:^{            self.lable.text =@"100";            NSLog(@"当前的线程 %@", [NSThread currentThread]);        }];     }];

2.线程之间可以设置依赖的关系

  //2. 线程之间可以设置依赖的关系,但是要注意不能相互依赖,否则会导致死锁        NSOperationQueue *queue = [[NSOperationQueue alloc] init];        NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){            sleep(2.0);            NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);        }];        NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){            sleep(2.0);            NSLog(@"执行第2次操作,线程:%@", [NSThread currentThread]);        }];        // operation1依赖于operation2        [operation1 addDependency:operation2];        [queue addOperation:operation1];        [queue addOperation:operation2];

3.NSBlockOperation的使用并发

//3. 只要NSBlockOperation封装的操作数 > 1,就会异步执行操作。但是会在 主线程和其他线程并发执行,也就是说还是会占用当前线程。        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){            NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);        }];        [operation addExecutionBlock:^() {            NSLog(@"group-1 线程:%@", [NSThread currentThread]);        }];        [operation addExecutionBlock:^() {            NSLog(@"group-2 线程:%@", [NSThread currentThread]);        }];        [operation addExecutionBlock:^() {            NSLog(@"group-3 线程:%@", [NSThread currentThread]);        }];        // 开始执行任务          [operation start];//    如果想要不占用主线程,则需要进行下面的操作,并去掉 [operation start],因为NSOperationQueue会自动进行线程的管理//    NSOperationQueue *queue = [[NSOperationQueue alloc] init];//    [queue addOperation:operation];

4.NSBlockOperation异步并发

//4. 异步并行        NSOperationQueue *queue = [[NSOperationQueue alloc] init];        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){             NSLog(@"group-1 %@", [NSThread currentThread]);        }];        [operation addExecutionBlock:^() {            NSLog(@"group-2 %@", [NSThread currentThread]);        }];        [operation addExecutionBlock:^() {            NSLog(@"group-3 %@", [NSThread currentThread]);        }];        [queue addOperation:operation];        [operation setCompletionBlock:^() {            NSLog(@"执行完毕");        }];

5.NSBlockOperation异步串行

  //5.异步串行    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    //这句代码是最重要,设置最大并发为1个就可以串行    queue.maxConcurrentOperationCount = 1;    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^(){        sleep(2.0);        NSLog(@"group-1 %@", [NSThread currentThread]);    }];    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){        sleep(2.0);        NSLog(@"group-2 %@", [NSThread currentThread]);    }];    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^(){        sleep(2.0);        NSLog(@"group-3 %@", [NSThread currentThread]);    }];    [queue addOperation:operation1];    [queue addOperation:operation2];    [queue addOperation:operation3];

6.异步先并行,然后串行

 //6.异步先并行,然后串行    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){        NSLog(@"group-1 %@", [NSThread currentThread]);    }];    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^(){        for (NSInteger i = 0 ; i<3; i++) {            sleep(2.0);            NSLog(@"2- %@", [NSThread currentThread]);        }    }];    [operation addExecutionBlock:^() {        NSLog(@"group-2 %@", [NSThread currentThread]);    }];    [operation addExecutionBlock:^() {        NSLog(@"group-3 %@", [NSThread currentThread]);    }];    //添加依赖    [operation2 addDependency:operation];    [queue addOperation:operation];    [queue addOperation:operation2];    [operation setCompletionBlock:^() {        NSLog(@"operation执行完毕");    }];    [operation2 setCompletionBlock:^() {        NSLog(@"operation2执行完毕");    }];

以上就是NSOperation的常见使用了,在iOS开发的过程中,如有问题欢迎交流,qq:2877025939
demo链接
感觉有用的上个星啊,哈哈。