UIGCD的用法,组任务


#import "ViewController.h"


@interface ViewController () {

    dispatch_queue_t suspendQueue;

}


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    //[self delayAction];

    //[self suspendQueueAction];

    [self changeTargetQueuePriority];

    

}


- (void)changeTargetQueuePriority {

    //队列的属性和最后一个有关

    //NULL,DISPATCH_QUEUE_SERIAL,串行队列 DISPATCH_QUEUE_CONCURRENT并行队列

    dispatch_queue_t queue1 = dispatch_queue_create("serialQueue1", NULL);

    dispatch_queue_t queue2 = dispatch_queue_create("serialQueue2", NULL);

    dispatch_queue_t queue3 = dispatch_queue_create("serialQueue3", NULL);

    

    dispatch_queue_t targetQueue = dispatch_queue_create("targetQueue", NULL);

    

    //三个队列的优先级作改变为目标Queue,依据目标Queue的类型来决定三个队列中的任务的执行顺序。

    //指定一个queue相应的事件处理提交到targetqueue上执行。这一步的作用只是类似于告知系统要将三个任务添加到串行队列中去。

    dispatch_set_target_queue(queue2, targetQueue);

    dispatch_set_target_queue(queue1, targetQueue);

    dispatch_set_target_queue(queue3, targetQueue);


    

    //分别向三个串行队列中添加三个任务,三个任务是并发执行的。这一步才是向串行队列添加并行任务。就是三个任务直接添加到串行队列了。然后再一个个运行。

    dispatch_async(queue1, ^{

        NSLog(@"queue1 start");

        [NSThread sleepForTimeInterval:3];

        NSLog(@"queue1 end");

        

    });

    

    dispatch_async(queue2, ^{

        NSLog(@"queue2 start");

        [NSThread sleepForTimeInterval:2];

        NSLog(@"queue2 end");


    });

    

    dispatch_async(queue3, ^{

        NSLog(@"queue3 start");

        [NSThread sleepForTimeInterval:1];

        NSLog(@"queue3 end");


    });

    


}


- (void)suspendQueueAction {

    

    suspendQueue = dispatch_queue_create("wxhl.serial", NULL);//创建一个串行队列

    

    dispatch_async(suspendQueue, ^{

        

        [NSThread sleepForTimeInterval:2];//一个串行队列直接就这个任务刚开始就加进去了,然后后面二个任务等着,这时候那挂起的过了一秒进入任务,这时候哪些另外两个还没有执行然后被挂起

        NSLog(@"任务1");

    });

    dispatch_async(suspendQueue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"任务2");

    });

    dispatch_async(suspendQueue, ^{

        [NSThread sleepForTimeInterval:2];

        NSLog(@"任务3");

    });

    

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        NSLog(@"挂起当前队列中未执行的任务");

        

        //对当前队列中未执行的任务进行挂起,对已执行的任务无影响

        dispatch_suspend(suspendQueue);

        dispatch_suspend(suspendQueue);

        

    });

    

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        NSLog(@"恢复之前挂起状态的队列");

        //恢复之前挂起的任务,使其继续执行

        dispatch_resume(suspendQueue);

    });

    

    

    

}


//延迟任务

- (void)delayAction {

    

    NSLog(@"begin");

    //第一个时间相当于一个参照时间,在第一个时间的基础上延迟第二个参数对应的时间

    //第二个时间是ns级别的时间

    double delayInSecond = 2.5;

    dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, delayInSecond  * NSEC_PER_SEC);

    

    CFAbsoluteTime beginTime = CFAbsoluteTimeGetCurrent();//当前系统时间

    

    //延迟任务:

//    1.异步追加,不阻塞当前线程。

//    2.延迟添加到队列的时间而不是添加到队列后延迟执行,延迟的时间代表的是添加任务到队列的时间,而不是将任务放到队列中延迟调用

    dispatch_after(delayTime, dispatch_get_main_queue(), ^{

        NSLog(@"delay time:%lf", CFAbsoluteTimeGetCurrent() - beginTime);

    });

    

    NSLog(@"end");

    

   

    

    //[self performSelector:

- (void)barrierTask{


    //10个线程来读10个章节

    //如果要使用barrier_async函数来设置障碍任务,则必须自己创建一个cocurrentQueue,不然你让系统自带的多线程受阻碍则影响其他程序运行。

    dispatch_queue_t queue = dispatch_queue_create("barrierQueue", DISPATCH_QUEUE_CONCURRENT);

    

    //随机执行

    

    for (int i = 1; i <= 10 ; i++) {

        dispatch_async(queue, ^{

            NSLog(@"读入第%i个章节", i);

            NSLog(@"%@", [NSThread currentThread]);

        });

    }

    

    //1个线程来写这个10个章节中读入的内容,这个障碍就是这个进程直接进行下去,不然按照异步添加的意思是不堵塞的,下面的也运行了,用了这个则堵塞了这个异步程序,类似于串行堵塞,

    dispatch_barrier_async(queue, ^{

        NSLog(@"写入文件");

    });

    

    //继续10个线程来读10个章节

    for (int i = 11; i <= 20 ; i++) {

        dispatch_async(queue, ^{

            NSLog(@"读入第%i个章节", i);

        });

    }

    




}

 

//semaphore

- (void)semaphoreTask {

    

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    

    array = [[NSMutableArray alloc] init];

    

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);//设置信号量

    

    

    for (int i = 0; i < 100000; i++) {

        dispatch_async(queue, ^{

            

            //信号量为0时等待,大于等于1时减1而不等待

            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//后面这个是堵塞时间。

            [array addObject:@(i)];

            

            //任务处理完毕,发信号,使信号量+1

            dispatch_semaphore_signal(semaphore);

            

        });

    }

    

    [array addObject:@9999];

    [array addObject:@12];

    

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        NSSet *set = [NSSet setWithArray:array];

        

        NSLog(@"array.count = %li", array.count);

        NSLog(@"set.count = %li", set.count);//集合不能有重复的


    });

    

}


//多元调用

- (void)efficientLoop {

    

    NSArray *array = @[@6, @"helloworld", @2, @"hi", @3];

    

    //遍历方式

    //1. 快速遍历

//    for (id object in array) {

//        NSLog(@"%@", object);

//    }

    

    //2. 枚举器遍历

    

//    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

//       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值