NSOperation:抽象类,不能直接使用,来进行约束子类具有共同的方法和属性
1.先将要执行的操作封装在NSOperation中
2,然后将这个对象添加到NSOperationQueue中
系统会自动的将NSOperationQueue的NSOperation取出来
将取出的的封装操作对象放在一条新线程去执行
NSOperation特有属性: 并发数:同时执行的任务数,比如同时开三个线程执行3个任务,并发数就是3 执行过程: 1.把操作添加到队列中 2.去线程池中取出空闲的线程,没有的话就去创建新的 3.把操作交给从线程池中去出的线程 4执行完成后,把线程池放回线程 5,重复2,3,4. 最大并发数: // 设置最大并发数 _queue.maxConcurrentOperationCount=3; 对列的取消 暂停 恢复 // 暂停 self.queue.suspended = YES; // 恢复 self.queue.suspended = NO; // 取消 [self.queue cancelAllOperations]; // 当前操作数 self.queue.operationCount
// 操作优先级
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<20; i++) {
NSLog(@"%@ op1",[NSThread currentThread]);
}
NSLog(@"end %@",[NSThread currentThread]);
}];
// 对op1 进行优先级的设置 这个里面叫做服务质量
op1.qualityOfService = NSQualityOfServiceUserInteractive;
// 下面这个方法可以去监听一个操作的进行 当这个操作结束后就会去调用.
[op1 setCompletionBlock:^{
NSLog(@" 结束了 %@",[NSThread currentThread]);
}];
// 操作依赖 依赖着要先执行完后,才能去执行
[op2 addDependency:op];
[op3 addDependency:op2]; // 注意这里不要让这里面的他们进行循环成一个圈...
[self.queue addOperations:@[op,op2,op3] waitUntilFinished:NO];
NSInvocationOperation: NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(demo) object:nil]; // 调用star 的方法 更新线程的状态 在主线程上执行 不会开启新的线程 //[op start]; // 执行的是在主线程上的同步操作.. // 若是想要去进行异步操作 将对象放在队列中 NSOperationQueue *queue = [[NSOperationQueue alloc]init];// 这样才是异步,开辟了新的线程 [queue addOperation:op]; - (void)demo{ NSLog(@"%@",[NSThread currentThread]); }
NSBlockOperation: - (void)demo{ // NSBlockOperation的封装操作数>1的时候,才为异步,开启新线程 // 这个情况 是在主线程上上运行 NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); }]; [bOp start]; } // 添加封装操作,执行异步的操作 - (void)demo2{ NSBlockOperation *bOp = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@ 1",[NSThread currentThread]); // 主线程中 }]; // 添加一个封装的操作 [bOp addExecutionBlock:^{ NSLog(@"%@ 2",[NSThread currentThread]); // 子线程中 }]; [bOp start]; } // 通过队列 完成开启子线程 完成异步操作 - (void)demo3{ NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); }]; // 通过队列可以完成在开辟子线程,异步操作 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperation:op]; } // 队列直接添加操作 直接开启子线程 完成异步 - (void)demo4{ // 可以直接这样 完成子线程的开启 异步 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperationWithBlock:^{ NSLog(@"%@",[NSThread currentThread]); }]; } // 全局队列
NSOperationQueue: @property (nonatomic,strong)NSOperationQueue *queue; - (NSOperationQueue *)queue{ if (!_queue) { _queue = [[NSOperationQueue alloc]init]; } return _queue; }
NSOperation 与GCD异同点:
1、GCD是一种轻量级的方法来实现多线程。控制起来比较麻烦,比如取消和暂停一个线程。
2、NSOperation和NSOperationQueue相对于GCD效率上要低一点,他们是面向对象的方式,从Mac OS X v10.6和iOS4开始,NSOperation底层也是用的GCD来实现的。可以在多个操作中添加附属,也可以重用操作,取消或者暂停。NSOperation和KVO是兼容,也就是说,可以在NSOperation中使用KVO,例如,你可以通过NSNotificationCenter去让一个操作开始执行。
自定义NSOperation: 步棸:
【1】、继承NSOperation类
【2】、重写“main”方法
【3】、在“main”方法中创建一个autoreleasepool
【4】、将自己的代码放在autoreleasepool中
注意:创建自动释放池的原因是,你不能访问主线程的自动释放池,所以需要自己创建一个。