NSOperation
- NSOperation的作用
- 配合使用NSOperation(操作)和NSOperationQueue(队列)也可以实现多线程编程
- NSOperation和NSOperationQueue实现多线程的具体步骤
- 1.先将需要执行的操作封装到NSOperation对象中
- 2.将NSOperation对象添加到NSOperationQueue(队列)中
- 3.系统会自动将NSOperationQueue中的NSOperation取出来
- 4.将取出的NSOperation封装的操作放到一条新线程中执行
- (如果队列的最大线程数为1的话,就不会创建新的线程)
NSOperationQueue的队列类型
- 主队列
- [NSOperationQueue mainQueue]
- 凡是添加到主队列中的任务(NSOperation),都会放到主线程中执行
- 非主队列(其他队列)
- [[NSOperationQueue alloc] init]
- 同时包含了:串行、并发功能
- 添加到这种队列中的任务(NSOperation),就会自动放到子线程中执行
如何创建队列
//自己创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//获取主队列
NSOperationQueue *queue = [[NSOperationQueue mainQueue]
- 队列的挂起属性:
- 这个属性决定是否把队列里的任务挂起,但是任务是原子性的,不会马上结束一个任务,而是会当前任务真正结束的时候才会被挂起
- @property (getter=isSuspended) BOOL suspended;
- 队列的最大线程数属性:
- 决定了这个队列最多可以创建多少个线程
- @property NSInteger maxConcurrentOperationCount;
- 队列添加任务的方法:
- 用这个方法添加进队列后,就会自动开始任务
- (void)addOperation:(NSOperation *)op;
如何创建任务
//方式1,执行这个任务的时候会自动调用opRunOne这个自定义的函数
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opRunOne) object:nil];
//方式2
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"op3------%@",[NSThread currentThread]);
}];
- 任务的开始方法:
- 一个任务可以自己写成一个类,把要执行的操作写在下面这个函数里
- 任务的取消属性以及方法:使用这个方法可以取消正在执行的任务
- @property (readonly, getter=isCancelled) BOOL cancelled;
- (void)cancel;
- 任务添加依赖的方法:如果希望A任务在其他的任务都执行完才执行的话,就给A任务添加其他任务的依赖例如:[A addDependency:B];
- -(void)addDependency:(NSOperation *)op;
- 用这个方法添加的代码会在自动创建的一个新的线程里运行:- (void)addExecutionBlock:(void (^)(void))block;
NSOperation线程间通信的方法
[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
//在自定义的队列中执行的代码
__block UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123"]];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//在main队列中执行的代码
image = nil;
}];
}];