多线程之NSOperation

——–NSInvocationOperation的使用
//1.创建操作
NSOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(耗时操作) object:@”参数”];
//2.启动—直接在当前线程执行任务
// [op start];
//2.放到队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//只要吧操作放到队列,就会异步执行调度这个方法
[queue addOperation:op];

———- NSBlockOperation的简单使用
//主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
//2.创建操作
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”%@”,[NSThread currentThread];
}];
//把操作放到队列
[queue addOperation:block];

———– NSBlockOperation的更简单使用
//1.创建队列
//相当于GCD的队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperationWithBlock:^{
NSLog(@”1.%@”,[NSThread currentThread]);
}];
//创建操作
NSOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”2.op1—-%@”,[NSThread currentThread]);
}];
[queue addOperation:op1];

———- 线程间的通讯(最重要的代码)
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperationWithBlock:^{
NSLog(@”耗时操作…%@”,[NSThread currentThread]);
//在主线程更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
NSLog(@”在主线程更新UI,%@”,[NSThread currentThread]);
}];
}];

———— 最大并发数
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//设置最大并发数
queue.maxConcurrentOperationCount = 3;
for (int i = 0; i < 10; i++) {
NSOperation *q = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@”%@—-%d”,[NSThread currentThread],i);
}];
[queue addOperation:q];
}

——— 挂起(暂停、继续)对队列的暂停和继续
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//判断操作的数量,当前队列里面是不是有操作
if (queue.operationCount == 0) {
NSLog(@”没有操作”);
return;
}
//队列的暂停状态
queue.suspended = !self.queue.suspended;
if (queue.suspended) {
NSLog(@”暂停”);
}else{
NSLog(@”继续”);
}

——– 取消队列的所有操作
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//取消队列的所有操作
[queue cancelAllOperations];
//取消队列的挂起状态(只要取消队列的操作就让队列处于不挂起状态)
queue.suspended = NO;

—– 依赖关系
/*
例子
1.下载一个小说的压缩包
2.解压缩,删除压缩包
3.更新UI
*/
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”下载小说的压缩包–%@”,[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”解压缩包,删除压缩包–%@”,[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”更新UI–%@”,[NSThread currentThread]);
}];
//指定任务间的依赖关系 — 依赖关系可以跨队列(可以在子线程下载完,到主线程更新UI)
[op2 addDependency:op1];
[op3 addDependency:op2];
//注意点:一定不要出现循环依赖 会死锁
//waitUntilFinished 类似于GCD调度组里面的通知
//NO 不等待 会直接执行 NSLog(@”完毕”);
//YES 等待上面的操作执行结束 再执行
[queue addOperations:@[op1,op2] waitUntilFinished:YES];
//在主线程更新UI
[[NSOperationQueue mainQueue]addOperation:op3];
NSLog(@”完毕”);

/*
总结
只要是NSOperation的子类,就能添加到操作队列
一旦操作添加到队列,就会自动异步执行
如果没有添加到队列,通过start方法,就会在当前操作执行
如果要做线程间的通讯,可以使用[NSOperationQueue mainQueue]拿到主队列,往主队列添加操作
*/
/*
GCD—–>ios4
- 将任务(block)添加到队列(串行/并发(全局)),指定执行任务的方法(同步(阻塞)/异步)
- 拿到 dispatch_get_main_queue().线程间的通讯
- NSOperation无法做到,一次性执行,延迟执行,调度组(op相对复杂)

NSOperation—–>ios2(后来苹果改造了NSOperation的底层)
- 将操作(异步执行)添加到队列(并发/全局)
- [NSOperationQueue mainQueue]主队列。任务添加到主队列,就会在主队列执行
- 提供了一些GCD不好实现的,“最大并发数”
- 暂停/继续 – “挂起”
- 取消所有的任务
- 依赖关系
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值