NSOperation(基于gcd):
配合 NSOperation和 NSOperatioQueue也能实现多线程编程;
使用步骤:
1,先将需要执行的操作封装在NSOperation中
2,将NSOperation对象添加到 NSOperationQueue中。系统会自动将NSOperationQueue中的NSOperation取出来放到一条新线程中执行;
NSOperation: 抽象类,有两个子类:NSInvocationOperation,NSBlockOperation
//NSOperationQueue
- (void)viewDidLoad
{
[super viewDidLoad];
// 创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 创建操作
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
// operation直接调用start(不用队列),是同步执行(在当前线程执行操作)
// [operation start];
// 添加操作到队列中,会自动异步执行
[queue addOperation:operation];
}
- (void)download
{
NSLog(@"download-----%@", [NSThread currentThread]);
}
<span style="color:#FF0000;">只有将操作放到队列中才会异步执行</span>
//NSBlockOperation
- (void)viewDidLoad
{
[super viewDidLoad];
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----11---%@", [NSThread currentThread]);
}];
[operation1 addExecutionBlock:^{//添加任务
NSLog(@"---下载图片----12---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----2---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----3---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"---下载图片----4---%@", [NSThread currentThread]);
}];
// 1.创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];//相当于gcd的全局并发队列
// 主队列
// NSOperationQueue *queue = [NSOperationQueue mainQueue];//相当于gcd的主队列(在主线程中执行)
// 2.添加操作到队列中(自动异步执行)
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];
[queue addOperation:operation4];
}
- (void)test
{
// NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
// NSLog(@"---下载图片----1---%@", [NSThread currentThread]);
// }];
NSBlockOperation *operation = [[NSBlockOperation alloc] init];
[operation addExecutionBlock:^{
NSLog(@"---下载图片----1---%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"---下载图片----2---%@", [NSThread currentThread]);
}];
[operation addExecutionBlock:^{
NSLog(@"---下载图片----3---%@", [NSThread currentThread]);
}];
[operation start];
// 任务数量大于1,才会开始异步执行
}
NSOperaion相关
最新推荐文章于 2019-04-08 20:13:00 发布