C语言【读书笔记】iOS-GCD-API

//在默认优先级的Global Dispatch Queue中执行block
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        /*
         *可并行执行的处理
         */
        dispatch_async(dispatch_get_main_queue(), ^{
            /*
             *只能在主线程中执行的处理
             */

        });
    });

C语言 1

在装有应用程序中都可以运用的Dispatch
Queue.它有肆个优先级。

在3秒后将钦定的Block追加到Main Dispatch
Queue.

进程快不少。未来的输入/输出硬件已经得以形成五次采用八个线程更快地并列读取了。能落成那百分之十效的就是Dispatch
I/O和Dispatch Data.

 //通过Dispatch I/O读写文件时,使用Global Dispatch Queue将1个文件按某个大小read/write.
    dispatch_async(queue, ^{/*读取0~8191字节*/ });
    dispatch_async(queue, ^{/*读取8192~16383字节*/ });
    dispatch_async(queue, ^{/*读取16384~24575字节*/ });
    dispatch_async(queue, ^{/*读取24576~32767字节*/ });
    dispatch_async(queue, ^{/*读取32768~40959字节*/ });
    dispatch_async(queue, ^{/*读取40960~49151字节*/ });
    dispatch_async(queue, ^{/*读取49152~57343字节*/ });
    dispatch_async(queue, ^{/*读取57344~65535字节*/ });
//此代码使用Global Dispatch Queue更新NSMutableArray类对象,所以执行后由内存错误导致应用程序异常结束的概率很高。此时应使用Dispatch Semaphore.
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    NSMutableArray *array=[[NSMutableArray alloc]init];
    for (int i=0; i<10000; ++i) {
        dispatch_async(queue, ^{
            [array addObject:[NSNumber numberWithInt:i]];
        });
    }

 

dispatch_queue_t myConcurrentDispatchQueue=dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

担保在应用程序执行中只举行五回钦定处理的API。

里面queue分为二种:

C语言 2

八,dispatch_sync

1,用法。

C语言 3

 

C语言 4

1,ull是C语言的数值字面量,是体现表示项目时拔取的字符串(表示“unsigned
long long
”)。如若应用NSEC_PER_MSEC则足以以微秒为单位总计。如若选取NSEC_PER_SEC则为毫阿秒的数值。

dispatch_queue_t mySerialDispatchQueue=dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);

参考资料:《Objective-C高级编程 iOS与OS
X八线程和内存管理》

C语言 5

C语言 6

用以生成queue.

//Global Dispatch Queue的获取方法
    //高优先级
    dispatch_queue_t globalDispatchQueueHigh=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    //默认优先级
    dispatch_queue_t globalDispatchQueueDefault=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //低优先级
    dispatch_queue_t globalDispatchQueueLow=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
    //后台优先级
    dispatch_queue_t globalDispatchQueueBackground=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);

 七,dispatch_barrier_async

3,用法

 

2,dispatch_time_t计算相对时间。dispatch_walltime用于总结相对时间。

 

 

//dispatch_sync
    //死锁1
    dispatch_queue_t queue=dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"Hello?");
    });

    //死锁2
    dispatch_queue_t queue=dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);
    dispatch_async(queue, ^{
        dispatch_sync(queue, ^{
            NSLog(@"Hello?");
        });
    });

    //死锁3
    dispatch_queue_t queue=dispatch_get_main_queue();
    dispatch_async(queue, ^{
        dispatch_sync(queue, ^{
            NSLog(@"Hello?");
        });
    });

 

十一,Dispatch Semaphore.

在blk_for_reading读操作后,插手写入处理。

3,用法

C语言 7

修改后代码:

在读取较大文件时,借使将文件分为合适的分寸并使用Global
Dispatch Queue并列读取的话,应该会比一般的读取

2,生成Concurrent Dispatch Queue。

一,Dispatch Queue

 

C语言 8

三种死锁的景况:

修改后代码:

 //修改后代码
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{
        //初始化
    });

用法:

 //将指定的Dispatch Queue挂起
    dispatch_suspend(queue);
    //将指定的Dispatch Queue恢复。
    dispatch_resume(queue);

无论是向哪些的Dispatch
Queue中增添处理,使用Dispatch
Group都可以监视那几个处理实施的利落。一旦检测到独具执行完成,就可将扫尾的处理追加到Dispatch
Queue中。那就是行使Dispatch Group的原故。

 手旗。而在Dispatch
Semaphore中,使用计数来落到实处该功效。计数为0时翘首以待,计数为1或高于1时,减去1而不等待。

dispatch_queue_t myConcurrentDispatchQueue=dispatch_queue_create("com.example.gcd.MyConcurrentDispatchQueue", DISPATCH_QUEUE_CONCURRENT);

 dispatch_async(myConcurrentDispatchQueue, ^{
        NSLog(@"block on myConcurrentDispatchQueue");
    });

C语言 9

C语言 10

 

十,dispatch_suspend/dispatch_resume.

C语言 11

 

C语言 12

二,dispatch_queue_create

用法:

C语言 13

    dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 1ull*NSEC_PER_SEC);
    long result=dispatch_semaphore_wait(semaphore, time);
    if (result==0) {
        //计数为0时等待。
        //可进行需要进行排他控制的处理
    }else{
        //计数为1或大于1时,减去1而不等待。
    }

原代码:

C语言 14

四,dispatch_set_target_queue

C语言 15

用以变更Dispatch Queue的变通。

 //在Dispatch Group中使用dispatch_group_wait函数等待全部处理执行结束。
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group=dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk0");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk1");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk2");
    });

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

1,用法:

//原代码
    static int initialized=NO;
    if (initialized==NO) {
        //初始化
        initialized=YES;
    }

1,Serial Dispatch Queue
等待未来实践中处理终结。

1,追加壹个Block到Global Dispatch
Queue,这一个Block如若全部执行已毕,就会执行Main Dispatch
Queue中截至处理用的Block.

 

1,Main Dispatch Queue. 

2,Global Dispatch Queue.

//Main Dispatch Queue的获取方法
    dispatch_queue_t mainDisaptchQueue=dispatch_get_main_queue()
    ;

 

C语言 16

十二,dispatch_once。

 

 

与Concurrent Dispatch
Queue配合,dispatch)barrier_async函数可落成高作用的数据库访问和文件访问。

    //修改后代码
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //Dispatch Semaphore的计数初始值设定为“1”。保证可访问NSMutableArray类对象的线程,同时只能有1个
    dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);

    NSMutableArray *array=[[NSMutableArray alloc]init];
    for (int i=0; i<10000; ++i) {
        dispatch_async(queue, ^{
            //一直等待,直到Dispatch Semaphore的计数值达到大于等于1.
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            //Dispatch Semaphore的计数达到1后,开始减去1而不等待。此时,semaphore减去1变成0.
            [array addObject:[NSNumber numberWithInt:i]];
            //将semaphore的计数值加1.
            dispatch_semaphore_signal(semaphore);
        });
    }
//在后台执行动作处理的Serial Dispatch Queue的生成方法
    dispatch_queue_t mySerialDispatchQueue=dispatch_queue_create("com.example.gcd.MySerialDispatchQueue", NULL);
    dispatch_queue_t globalDispatchQueueBackground=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);

“非同步”,简单形成死锁。

Dispatch
Semaphore是具有计数的信号,该计数是二十四线程编程中的计数类型信号。所谓信号,类似于过街道时常用的

 //blk3_for_reading后加入写入处理。
    //dispatch_barrier_async会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理追加到该Concurrent Dispatch Queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue才恢复为一般的动作。
    dispatch_queue_t queue=dispatch_queue_create("com.example.gcd.ForBarrier", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, blk0_for_reading);
    dispatch_async(queue, blk1_for_reading);
    dispatch_async(queue, blk2_for_reading);
    dispatch_async(queue, blk3_for_reading);
    dispatch_barrier_async(queue, blk_for_writing);
    dispatch_async(queue, blk4_for_reading);
    dispatch_async(queue, blk5_for_reading);
    dispatch_async(queue, blk6_for_reading);
    dispatch_async(queue, blk7_for_reading);

 

dispatch_async(queue, ^{
        /*
         *想执行的任务
         */

    });

C语言 17

挂起后,追加到Dispatch
Queue中但不曾履行的处理在此之后截止实施。而回复则使得那个处理可以继续执行。

1,生成Serial Dispatch Queue.

C语言 18

2,其好处。

六,Dispatch Group

三,Main Dispatch Queue/Global Dispatch
Queue

C语言 19

十三,Dispatch I/O。

dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply(10, queue, ^(size_t index) {
        NSLog(@"%ld",index);
    });
    NSLog(@"done");

 

在主线程中推行的Dispatch Queue.

用法:

 

五,dispatch_after

 

 //追加3个Block到Global Dispatch Queue,这些Block如果全部执行完毕,就会执行Main Dispatch Queue中结束处理用的Block.
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group=dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk0");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk1");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"blk2");
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"done");
    });

C语言 20

九,dispatch_apply.

2,Concurrent Dispatch Queue
不等待以后施行中拍卖已毕。

2,在Dispatch
Group中使用dispatch_group_wait函数等待全部甩卖实施落成。

dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_main_queue(), ^{
        NSLog(@"waited at least three seconds.");
    });

原代码:

 钦赐时间后举办处理。

dispatch_apply函数是dispatch_sync函数和Dispatch
Group的关联API。该函数按钦定的次数将点名的Block追加到内定的Dispatch
Queue中,并听候全体拍卖实施落成。