NSOperation实际是GCD的封装。
两种使用方式
1.NSInvocationOperation和NSBlockOperation
2.自定义类继承NSOperation。
相关概念:
1.NSOperationQueue,队列,可以认为是一个线程池。
addOperation #添加到队列
setMaxConcurrentOperationCount #设置线程池中最大变化数
2.状态
ready、cancelled、executing、finished、asynchronous
3.依赖 addDependency
NSLog(@"主线程");
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationAction) object:nil];
[operation start];
NSLog(@"end");
// 线程执行的方法
- (void)invocationAction
{
for (int i=0; i<3; i++) {
NSLog(@"invocationAction %d",i);
[NSThread sleepForTimeInterval:1]; // 模拟延时
}
}
查看控制台打印的信息:现在id都一样,同步操作,会阻塞线程。
还可以用另外一个方法,block的形式。
NSLog(@"主线程");
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<3; i++) {
NSLog(@"invocationAction %d",i);
[NSThread sleepForTimeInterval:1]; // 模拟延时
}
}];
[blockOperation start];
NSLog(@"end");
上面2个方式,都是线程同步操作。
很多时候,我们更需要的是异步。
@property(nonatomic,strong)NSOperationQueue *operQueue;
然后
NSLog(@"主线程");
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
for (int i=0; i<3; i++) {
NSLog(@"invocationAction %d",i);
[NSThread sleepForTimeInterval:1]; // 模拟延时
}
}];
if (!self.operQueue) {
self.operQueue = [[NSOperationQueue alloc] init];
}
[self.operQueue addOperation:blockOperation];
NSLog(@"end");
这样就异步了。
本文详细介绍了NSOperation作为GCD封装的应用场景,包括两种主要使用方式:NSInvocationOperation和NSBlockOperation以及通过继承NSOperation来自定义类。此外还介绍了NSOperationQueue的基本使用方法,包括如何设置最大并发数及实现异步操作。
1299

被折叠的 条评论
为什么被折叠?



