IOS多线程-NSOperation

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]);
    }];
  • 任务的开始方法:
    • -(void)start;
  • 一个任务可以自己写成一个类,把要执行的操作写在下面这个函数里
    • -(void)main;
  • 任务的取消属性以及方法:使用这个方法可以取消正在执行的任务
    • @property (readonly, getter=isCancelled) BOOL cancelled;
    • (void)cancel;
  • 任务添加依赖的方法:如果希望A任务在其他的任务都执行完才执行的话,就给A任务添加其他任务的依赖例如:[A addDependency:B];
    • -(void)addDependency:(NSOperation *)op;
  • 用这个方法添加的代码会在自动创建的一个新的线程里运行:- (void)addExecutionBlock:(void (^)(void))block;

NSOperation线程间通信的方法

  • 与GCD类似
 [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
        //在自定义的队列中执行的代码
       __block UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123"]];
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
           //在main队列中执行的代码
            image = nil;
        }];
    }];

你可能感兴趣的:(IOS多线程-NSOperation)