您的位置:首页 > 移动开发 > IOS开发

iOS 中的 NSoperation 多线程

2016-03-02 20:54 381 查看
// 第一种: NSOperation(抽象类)
// NSOperation 本身没有开辟子线程能力,可以在子线程,也可以在主线程,他只是一个操作, 我们用到的都是他的子类( NSInvocationOperation  NSBlockOperation)
// *NSOperation 是一个抽象类,我们都是使用它的子类(面试)
// *NSOperation的子类其实就是一个任务,自己没有开辟线程的能力,所以说该任务,在子线程中执行(start),就是在主线程, 在子线程中就是在子线程
- (void)createNSInvocationOperation {
// 创建NSInvocationOperation对象
NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invocation) object:nil];

// 可能用到的属性
// invocation.isCancelled, 判断这个任务有没有取消,当任务调用 isCancel,这个属性就变成了 YES,这个 cancel 也取消不了正在执行的任务,任务还没开始就执行取消, 同 Thread一样
// 执行该任务
[invocation start];
}
- (void)invocation {
NSLog(@"--主线程,%d",[NSThread isMainThread]);
}

// 创建 NSBlock, [NSBlockOperation blockOperationWithBlock
- (void)createBlockOperation {
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//里面写具体操作

NSLog(@"这是一个 BlockOperation在主线程%d",[NSThread isMainThread]);
}];
[blockOperation start];
}

// 第二种 NSOperationQueue

//    NSOperationQueue, 是操作队列, 用来管理一组 Operation 对象的执行 一个任务就是一个线程
// 这是一个任务队列,就是一个容器,里面都是一个个任务,可以是 block 任务,可以是 block 任务,也可以是 invocation 任务(并行)
// **NSOperationQueue,才具有开辟子线程的能力 , NSInvocationOperation NSBlockOperation只是用来执行任务的
// 用来管理里面所有的内容
// 相当于开辟了一个线程队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// [NSOperationQueue mainQueue] 获取主线程
// 任务1 NSInvocationOperation 任务
NSInvocationOperation *inv = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(invAction) object:nil];
//任务2 NSBlockOperation 任务
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 100; i++) {
NSLog(@"BB");
}
}];
//任务3
NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 100; i++) {
NSLog(@"CC");
}

}];
// 把3个任务添加到线程队列, 也就是有3个线程
[queue addOperation:inv];
[queue addOperation:block1];
[queue addOperation:block2];

// 添加到线程队列, 系统就会自己开启执行任务
// 设置最大并发数,默认为-1,maxConcurrentOperationCount设置线程次序
// 队列 FIFO,先进先出,所以当我们设置最大并发数为1的时候,会按照添加的顺序,先把最早加入队列任务完成之后,再去执行后面添加的任务.(并行 - > 串行)
//    queue.maxConcurrentOperationCount = 1;

// 设置依赖关系 addDependency
// *一定要在任务添加到队列之前去设置(要求:3要在2前面, 2依赖3)
[block1 addDependency:block2];
// A addDependency:B意思就是: A 依赖于 B, A 的执行,依赖 B 的完成
// 添加依赖的时候,要避免循环依赖,循环依赖会导致两个任务都不会执行
[block2 addDependency:block1];

// 一些常用属性
// 查看添加到队列中的所有任务
//    queue.operations,里面放的是添加到队列中的所有任务
// 常用方法
//    [queue cancelAllOperations], 执行取消尚未开始执行的任务

}
- (void)invAction {
for (int i = 0; i<100; i++) {
NSLog(@"AA");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: