多线程-NSInvocationOperation

在NSThread中提供了三种使用方式,其中一种可以获取一个NSThread对象,通过调用start方法开始执行任务,在NSOperation中也是存在start对象方法的,接下来就演示下NSInvocationOperation的使用以及start方法使用上的注意

示例代码:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
     [self test1];
    // [self test2];
}
// 开辟新线程
- (void)test1{
    
    // 1.创建操作对象
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
    // 2.创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 3.将操作对象添加到队列中
    [queue addOperation:operation];
    
    // LOG: -[ViewController demo]-->{number = 2, name = (null)}
}

// 没有开辟新线程
- (void)test2{
    
    // 1.创建操作对象
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
    
    // 2.开始执行操作
    [operation start];
    
    // LOG:  -[ViewController demo]-->{number = 1, name = main}

}

// 被调用的方法
- (void)demo{
    
    NSLog(@"%s-->%@",__func__,[NSThread currentThread]);
}

@end

结论:

NSInvocationOperation中默认情况下调用start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作
只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

在调用start方法和将操作对象添加到队列中时,系统最终都会调用一个 "- (void)main;"方法

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