NSOperation(经常使用):
1、为什么会有NSOperation?
弥补gcd的一些问题:
1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消block之内操作
弥补gcd的一些问题:
1)下载为例子:如果gcd放到队列中的block操作面对网络有问题,block之外无法取消block之内操作
2)提供了gcd不能提供很多功能()
2、什么是NSOperation?
1. 面向oc的接口;基于gcd的多线程解决方案
2. queue队列的类型:主队列/非主队列
3. 任务执行的方式:同步/异步
1. 面向oc的接口;基于gcd的多线程解决方案
2. queue队列的类型:主队列/非主队列
3. 任务执行的方式:同步/异步
3、如何使用NSOperation?
1. 无法直接使用NSOperation类
2. 只能使用两个子类:
1. 无法直接使用NSOperation类
2. 只能使用两个子类:
NSInvocationOperation (了解;几乎都不用)
NSBlockOperation (理解;重点)
执行方式:
1. 同步:
使用NSBlockOperation的addExecutionBlock方法,如果是一个操作会在主线程中做
1. 同步:
使用NSBlockOperation的addExecutionBlock方法,如果是一个操作会在主线程中做
2. 异步
1) 使用NSBlockOperation的addExecutionBlock方法,如果是多个操作,第一个会在主线程中做;剩余的会在子线程中做
2)将NSBlockOperation加入到非主队列中,会自动启动子线程来执行;但是不确定同一时间会启动多少个线程来执行
3. 队列:NSOperationQueue (掌握)
4. NSBlockOperation + NSOperationQueue (掌握)
//----------------------------------------------------------
-(void)displayss{
for (int i=0; i<3; i++) {
NSLog(@"....%d....",i);
}
}
for (int i=0; i<3; i++) {
NSLog(@"....%d....",i);
}
}
- (IBAction)blockOperation:(id)sender {
//addExecutionBlock添加一个blockOperation,会在主线程中执行
//如果多个,剩下的都会在子线程中执行
//1.创建NSBlockOperation
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
//2.添加要执行的任务
[operation addExecutionBlock:^{
NSLog(@"下载图片一: %@", [NSThread currentThread]);
[self displayss];
}];
[operation addExecutionBlock:^{
NSLog(@"下载图片二: %@", [NSThread currentThread]);
[self displayss];
}];
[operation addExecutionBlock:^{
NSLog(@"下载图片三: %@", [NSThread currentThread]);
[self displayss];
}];
//如果多个,剩下的都会在子线程中执行
//1.创建NSBlockOperation
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
//2.添加要执行的任务
[operation addExecutionBlock:^{
NSLog(@"下载图片一: %@", [NSThread currentThread]);
[self displayss];
}];
[operation addExecutionBlock:^{
NSLog(@"下载图片二: %@", [NSThread currentThread]);
[self displayss];
}];
[operation addExecutionBlock:^{
NSLog(@"下载图片三: %@", [NSThread currentThread]);
[self displayss];
}];
//3.启动执行任务
[operation start];
}
//----------------------------------------------------------
NSOperation总结:
队列类型
1. 主队列(添加到主队列中的操作都会在主线程中执行):[NSOperationQueue mainQueue]
1. 主队列(添加到主队列中的操作都会在主线程中执行):[NSOperationQueue mainQueue]
2. 非主队列(添加到非主队列中的操作都会在子线程中执行):[[NSOperationQueue alloc] init];
设置最大并发数(执行操作的子线程数): 设置NSOperationQueue的maxConcurrentOperationCount属性
添加操作到队列中的两种方式:
1. 使用addOperationQueue方法
2. 使用addOperationWithBlock: (^{})方法
取消/暂停/恢复操作:
1. 取消所有操作:cancelAllOperations
2. 暂停所有操作:[queue setSuspended:YES];
3. 恢复所有操作:[queue setSuspended:NO];
操作依赖的设置:
[operation addDependency: otherOperation];
dispatch_create(queue, ^{//任务})
什么时候使用NSOperation还是GCD
GCD没有的功能:
设置最大并发数
依赖