多线程(二)

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor=[UIColor whiteColor];

    //GCD

//    [self test1];

//      [self queueGroup];

//    [self blockOperation];

    [self operationQueue];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

-(void)test1{

    //DISPATCH_QUEUE_CONCURRENT    表示创建并行队列
    //DISPATCH_QUEUE_SERIAL        表示创建串行队列
//    dispatch_queue_t queue=dispatch_queue_create("Eric", DISPATCH_QUEUE_SERIAL);

    //全局并行队列:这应该是唯一一并行队列,只要是并行任务一般都加入到这个队列
//    dispatch_queue_t queue2=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //同步任务:不会另开线程(sync)
    //异步任务:会另开线程(async)
}

/*!
 *  队列组:队列组可以将很多队列添加到一个组里,这样做的好处是,当这个组所有的任务都执行完了,队列组会通过一个方法通知我们。这是一个很实用的功能
 */
-(void)queueGroup{
        //1.创建队列组
    dispatch_group_t group=dispatch_group_create();
        //2.创建队列
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        //3.多次使用队列组的方法执行任务,只有异步方法
    dispatch_group_async(group, queue, ^{
        for (NSInteger i=0; i<3; i++) {
            NSLog(@"group-01-%@",[NSThread currentThread]);
        }
    });
    dispatch_group_async(group, dispatch_get_main_queue(), ^{
        for (NSInteger i=0; i<8; i++) {
            NSLog(@"group-02-%@",[NSThread currentThread]);
        }
    });
    dispatch_group_async(group, queue, ^{
        for (NSInteger i=0; i<5; i++) {
            NSLog(@"group-03-%@",[NSThread currentThread]);
        }
    });

    //4.队列组中的任务都完成后会自动通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"完成 - %@",[NSThread currentThread]);
    });

}

-(void)blockOperation{

    //NSBlockOperation默认会在当前线程执行。但是 NSBlockOperation 还有一个方法:addExecutionBlock: ,通过这个方法可以给 Operation 添加多个执行 Block。这样operation中的任务会并发执行,它会在主线程和其它多个线程中执行这些任务

    //1.创建NSBlockOperation对象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
    }];
    // 添加多个Block
    for (NSInteger i=0; i<5; i++) {
        [operation addExecutionBlock:^{
            NSLog(@"第%ld次:%@",i,[NSThread currentThread]);
        }];
    }
    //开始任务
    [operation start];

    //NOTE:addExecutionBlock 方法必须在 start() 方法之前执行,否则就会报错:
}

-(void)operationQueue{
//    //因为主队列比较特殊,所以会单独有一个类方法来获得主队列。那么通过初始化产生的队列就是其他队列了,因为只有这两种队列,除了主队列,其他队列就不需要名字了。
//    //注意:其他队列的任务会在其他线程并行执行
//    
//    //1.创建一个其他队列
//    NSOperationQueue *queue=[[NSOperationQueue alloc] init];
//    //2.创建NSBlockOperation对象
//    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
//        NSLog(@"%@",[NSThread currentThread]);
//    }];
//    //3.添加多个Block
//    for (NSInteger i=0; i<5; i++) {
//        [operation addExecutionBlock:^{
//             NSLog(@"第%ld次:%@",i,[NSThread currentThread]);
//        }];
//    }
    //设置最大并发数 当设置为1时 就变成串行
    queue.maxConcurrentOperationCount=1;
//    //4.队列添加到任务
//    [queue addOperation:operation];



    //NSBlockOperation还有一个非常实用的功能,那就是添加依赖。比如有 3 个任务:A: 从服务器上下载一张图片,B:给这张图片加个水印,C:把图片返回给服务器。这时就可以用到依赖了:
    //1.任务一:下载图片
    NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"下载图片 - %@",[NSThread currentThread]);
        [NSThread sleepForTimeInterval:1.0];
    }];
    //2.任务二:打水印
    NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"打水印 - %@",[NSThread currentThread]);
        [NSThread sleepForTimeInterval:1.0];
    }];
    //3.任务三:上传图片
    NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"上传图片 - %@",[NSThread currentThread]);
        [NSThread sleepForTimeInterval:1.0];
    }];
    //4.设置依赖
    //任务二依赖任务一
    [operation2 addDependency:operation1];
    //任务三依赖任务二
    [operation3 addDependency:operation2];
    //5.创建队列并加入任务
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];

    //参数二:NSOperationQueue是并行的,所以加入该队列的任务都会在其他线程并行执行,不会阻塞主线程。但如果参数二为YES的话主线程会阻塞,直到queue中的任务执行完成
    [queue addOperations:@[operation1,operation2,operation3] waitUntilFinished:NO];

    NSLog(@"完成");
}


@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值