一:什么是NSOperation:
NSOperation ,是苹果提供的一套多线程解决方案。NSOperation是对GCD面向对象的封装。是完全面向对象的。
NSOperation是一个抽象类,并不能直接使用,没有封装操作的能力。想要封装操作,必须使用它的子类:
1:NSInvocationOperation
2: NSBlockOperation
3: 继承自NSOperation封装的对象。实现内部相应的方法(程序员自定义)
二:NSOperation的使用以及使用场景
以上我们知道要使用NSOperation封装操作必须要使用它的子类来封装。
1 NSInvocationOperation。
初始化:initWithTarget:Select:Object
//:初始化方法1: initWithTarget:selector:object 在当前线程执行operation方法没有开启新的线程
NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operation) object:nil];
[operation start];
-(void)operation
{
NSLog(@"%@",[NSThread currentThread]);
}
另一个中初始化方法不常用,知道就可以了
NSMethodSignature * sign = [self.class instanceMethodSignatureForSelector:@selector(operationMethod)];
NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:sign];
invocation.target = self;
invocation.selector = @selector(operation);
NSInvocationOperation * operaton2 = [[NSInvocationOperation alloc]initWithInvocation:invocation];
[operaton2 start];
-(void)operation
{
NSLog(@"%@",[NSThread currentThread]);
}
来看一下线程的情况:
2019-03-14 11:12:23.225953+0800 MotherBaby[16847:1358173] <NSThread: 0x600000097900>{number = 1, name = main}
2019-03-14 11:12:23.226141+0800 MotherBaby[16847:1358173] <NSThread: 0x600000097900>{number = 1, name = main}
以上两种初始化方法,封装了一个NSInvocationOperation 对象,手动开启执行start方法之后,并没有开启新的线程,是在当前线程中完成的。
2 NSBlockOperation
NSBlockOperation,是用一个block 封装操作。初始化方法如下:
NSBlockOperation * blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
控制台打印情况:
2019-03-14 11:16:46.298272+0800 MotherBaby[16892:1361194] <NSThread: 0x6000037d6900>{number = 1, name = main}
可以看出,此时的NSBlockOperation 是在主线程即当前线程完成的。
如果只有一个操作,那么NSBlockOperation 是在当前线程完成的,如果多于一个操作,那么会开启新的线程来执行。向NSBlock Operation添加操作的方法如下:
[blockOperation addExecutionBlock:^{
NSLog(@"block");
NSLog(@"%@",[NSThread currentThread]);
}];
[blockOperation start];
控制台打印情况:
2019-03-14 11:25:47.444035+0800 MotherBaby[17023:1367237] block
2019-03-14 11:25:47.444122+0800 MotherBaby[17023:1367214] <NSThread: 0x600001cbea00>{number = 1, name = main}
2019-03-14 11:25:47.444203+0800 MotherBaby[17023:1367237] <NSThread: 0x600001cef1c0>{number = 3, name = (null)}