美文网首页
IOS GCD 分析

IOS GCD 分析

作者: 小暖风 | 来源:发表于2018-07-04 16:50 被阅读77次

    一:base.h

    二:block.h

    1.

    dispatch_block_flags:DISPATCH_BLOCK_BARRIER,DISPATCH_BLOCK_DETACHED,DISPATCH_BLOCK_ASSIGN_CURRENT,DISPATCH_BLOCK_NO_QOS_CLASS,DISPATCH_BLOCK_INHERIT_QOS_CLASS,DISPATCH_BLOCK_ENFORCE_QOS_CLASS

    2.

    dispatch_block_t dispatch_block_create(dispatch_block_flags_t flags, dispatch_block_t block);

    说明:

    创建block的一种方式,flags 参数用来设置 block 的标记,block 参数用来设置具体的任务。

    实例:

    dispatch_block_t block = dispatch_block_create(0, ^{

            NSLog(@"hello");

        });

    block();

    3.

    dispatch_block_t dispatch_block_create_with_qos_class(dispatch_block_flags_t flags,dispatch_qos_class_t qos_class,int relative_priority,dispatch_block_t block);

    说明:

    创建block的另一种方式,这种方式在创建 block 的同时可以指定了相应的优先级。dispatch_qos_class_t 是 qos_class_t 的别名。qos_class_t是一种枚举,有以下类型:

    QOS_CLASS_USER_INTERACTIVE:user interactive等级表示任务需要被立即执行,用来在响应事件之后更新 UI,来提供好的用户体验。这个等级最好保持小规模。

    QOS_CLASS_USER_INITIATED:user initiated等级表示任务由 UI 发起异步执行。适用场景是需要及时结果同时又可以继续交互的时候。

    QOS_CLASS_DEFAULT:default默认优先级

    QOS_CLASS_UTILITY:utility等级表示需要长时间运行的任务,伴有用户可见进度指示器。经常会用来做计算,I/O,网络,持续的数据填充等任务。这个任务节能。

    QOS_CLASS_BACKGROUND:background等级表示用户不会察觉的任务,使用它来处理预加载,或者不需要用户交互和对时间不敏感的任务。

    QOS_CLASS_UNSPECIFIED:unspecified未指明

    实例:

    dispatch_block_t qosBlock = dispatch_block_create_with_qos_class(0, QOS_CLASS_DEFAULT,0, ^{NSLog(@"qos do some thing...");});

    4.

    void dispatch_block_perform(dispatch_block_flags_t flags,DISPATCH_NOESCAPE dispatch_block_t block);

    说明:

    可能是 创建,执行一个block,并自行销毁。等同以下代码,dispatch_block_t b = dispatch_block_create(flags, block);b();Block_release(b);

    实例:

    dispatch_block_perform(0, ^{

            UIImageView* imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(0,100,300,300)];

            imageView.backgroundColor= [UIColorgrayColor];

            NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://lvpfileserver.iuoooo.com/Jinher.JAP.BaseApp.FileServer.UI/FileManage/GetFile?fileURL=49e54e46-3e17-4ca4-8f03-db71fb8f9655/2017081910/09b30913-e4bc-4218-9d0f-8afc05e49cc6_86b45da2-22ac-4194-945a-80a1f7586fb8.jpg"]];

            UIImage* image = [UIImageimageWithData:data];

            imageView.image= image;

            [self.viewaddSubview:imageView];

        });

    5.

    long dispatch_block_wait(dispatch_block_tblock,dispatch_time_ttimeout);

    说明:

    同步等待,直到代码块执行完成或者超时。如果代码块在指定的时间内完成,则返回零;如果块超时,则返回非零值。该函数会阻塞当前线程进行等待。传入需要设置的block和等待时间timeout。timeout参数表示函数在等待block执行完毕时,应该等待多久。如果执行block所需的时间小于timeout,则返回 0,否则返回非 0 值。此参数也可以取常量DISPATCH_TIME_FOREVER,这表示函数会一直等待block执行完,而不会超时。可以使用dispatch_time函数和DISPATCH_TIME_NOW常量来方便的设置具体的超时时间。

    如果block执行完成,dispatch_block_wait就会立即返回。不能使用dispatch_block_wait来等待同一个block的多次执行全部结束;这种情况可以考虑使用dispatch_group_wait来解决。也不能在多个线程中,同时等待同一个block的结束。同一个block只能执行一次,被等待一次。

    注意:因为dispatch_block_wait会阻塞当前线程,所以不应该放在主线程中调用。

    有时我们需要等待特定的 block 执行完成之后,再去执行其他任务。有两种方法可以获取到指定 block 执行结束的时机,dispatch_block_wait是其中一种,另一种是方法是dispatch_block_notify。

    实例:

    dispatch_queue_t concurrentQuene = dispatch_queue_create("concurrentQuene", DISPATCH_QUEUE_CONCURRENT);

        dispatch_async(concurrentQuene, ^{

            dispatch_queue_tallTasksQueue =dispatch_queue_create("allTasksQueue",DISPATCH_QUEUE_CONCURRENT);

            dispatch_block_tblock =dispatch_block_create(0, ^{

                NSLog(@"开始执行");

                [NSThread sleepForTimeInterval:3];

                NSLog(@"结束执行");

            });

            dispatch_async(allTasksQueue, block);

            // 等待时长,10s 之后超时

            dispatch_time_ttimeout =dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10*NSEC_PER_SEC));

            longresutl =dispatch_block_wait(block, timeout);

            if(resutl ==0) {

                NSLog(@"执行成功");

            }else{

                NSLog(@"执行超时");

            }

        });

    6.

    void dispatch_block_notify(dispatch_block_t block,dispatch_queue_t queue,dispatch_block_t notification_block);

    说明:

    该函数接收三个参数,第一个参数是需要监视的block,第二个参数是监听的block执行结束之后要提交执行的队列queue,第三个参数是待加入到队列中的block。 和dispatch_block_wait的不同之处在于:dispatch_block_notify函数不会阻塞当前线程。

    实例:

    NSLog(@"---- 开始设置任务 ----");

    dispatch_queue_tserialQueue =  dispatch_queue_create("com.fyf.serialqueue",  DISPATCH_QUEUE_SERIAL);

        // 耗时任务

        dispatch_block_ttaskBlock =dispatch_block_create(0, ^{

            NSLog(@"开始耗时任务");

            [NSThread sleepForTimeInterval:2.f];

            NSLog(@"完成耗时任务");

        });

    dispatch_async(serialQueue, taskBlock);

        // 更新 UI

        dispatch_block_trefreshUI =dispatch_block_create(0, ^{

            NSLog(@"更新 UI");

        });

    // 设置监听

        dispatch_block_notify(taskBlock, dispatch_get_main_queue(), refreshUI);

        NSLog(@"---- 完成设置任务 ----");

    7.

    void dispatch_block_cancel(dispatch_block_tblock);

    说明:

    这个函数用异步的方式取消指定的block。取消操作使将来执行dispatch block会立即返回,但是对已经在执行的dispatch block没有任何影响。当一个block被取消时,它会立即释放捕获的资源。如果要在一个block中对某些对象进行释放操作,在取消这个block的时候,需要确保内存不会泄漏。

    实例:

    dispatch_queue_tserialQueue = dispatch_queue_create("com.fyf.serialqueue", DISPATCH_QUEUE_SERIAL);// 耗时任务dispatch_block_t firstTaskBlock = dispatch_block_create(0, ^{NSLog(@"开始第一个任务"); [NSThreadsleepForTimeInterval:1.5f];NSLog(@"结束第一个任务");});// 耗时任务dispatch_block_t secTaskBlock = dispatch_block_create(0, ^{NSLog(@"开始第二个任务"); [NSThreadsleepForTimeInterval:2.f];NSLog(@"结束第二个任务");});dispatch_async(serialQueue, firstTaskBlock);dispatch_async(serialQueue, secTaskBlock);// 等待 1s,让第一个任务开始运行[NSThreadsleepForTimeInterval:1];dispatch_block_cancel(firstTaskBlock);NSLog(@"尝试过取消第一个任务");dispatch_block_cancel(secTaskBlock);NSLog(@"尝试过取消第二个任务");

    8.

    long dispatch_block_testcancel(dispatch_block_t block);

    说明:

    测试是否已取消给定的调度块。如果成功取消代码块,则返回非零值,否则返回零。该函数的作用是让我们能够知道当前任务块是否已经被取消。

    实例:

    返回值经常错误

    三:data.h

    1.

    dispatch_data_t dispatch_data_create(constvoid*buffer,size_tsize,dispatch_queue_t _Nullable queue,dispatch_block_t _Nullable destructor);

    说明:

    dispatch_data_t,表示连续或稀疏内存区域的不可变对象。

    dispatch_data_create,使用指定的内存缓冲区创建新的代码块数据对象。

    实例:

    2.

    size_t dispatch_data_get_size(dispatch_data_t data);

    说明:

    返回代码块数据对象的内存大小。

    实例:

    3.

    dispatch_data_t dispatch_data_create_map(dispatch_data_t data,const void *_Nullable *_Nullable buffer_ptr,size_t*_Nullablesize_ptr);

    说明:

    返回一个新的调度数据对象,其中包含指定对象内存的连续表示。

    实例:

    4.

    dispatch_data_t dispatch_data_create_concat(dispatch_data_t data1,dispatch_data_t data2);

    说明:

    返回一个新的调度数据对象,该对象由来自其他两个数据对象的连接数据组成。

    实例:

    5.

    dispatch_data_t dispatch_data_create_subrange(dispatch_data_t data,size_toffset,size_tlength);

    说明:

    返回一个新的调度数据对象,其内容由另一个对象的内存区域的一部分组成。

    实例:

    6.

    typedef bool(^dispatch_data_applier_t)(dispatch_data_tregion,size_toffset,constvoid*buffer,size_tsize);

    说明:

    遍历。

    实例:

    7.

    bool dispatch_data_apply(dispatch_data_tdata,DISPATCH_NOESCAPE dispatch_data_applier_t applier);

    说明:

    遍历调度数据对象的内存并在每个区域上执行自定义代码。 

    实例:

    8.

    dispatch_data_t dispatch_data_copy_region(dispatch_data_t data,size_tlocation,size_t*offset_ptr);

    说明:

    返回包含另一个数据对象中的一部分数据的数据对象。

    实例:

    四:dispatch.h

    五:group.h

    1.

    dispatch_group_t dispatch_group_create(void);

    说明:

    dispatch_group_t,提交到队列以进行异步调用的一组块对象。

    dispatch_group_create,创建一个可以与块对象关联的调度组。

    实例:

    2.

    void dispatch_group_async(dispatch_group_t group,dispatch_queue_t queue,dispatch_block_t 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, ^{

            [NSThread sleepForTimeInterval:1];

            NSLog(@"group1");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"group2");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:3];

            NSLog(@"group3");

        });

        dispatch_group_notify(group, dispatch_get_main_queue(), ^{

            NSLog(@"updateUi");

        });

    3.

    void dispatch_group_async_f(dispatch_group_tgroup,dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    将应用程序定义的函数提交给调度队列,并将其与指定的调度组关联。

    实例:

    4.

    long dispatch_group_wait(dispatch_group_t group,dispatch_time_t timeout);

    说明:

    同步等待先前提交的块对象完成; 如果块在指定的超时时间段之前未完成,则返回。成功时返回零(与指定超时之前完成的组关联的所有块)或错误时返回非零(发生超时)。

    实例:

    5.

    void dispatch_group_notify(dispatch_group_t group,dispatch_queue_t queue,dispatch_block_t block);

    说明:

    在一组先前提交的块对象完成时,计划要将块对象​​提交到队列。

    实例:

    6.

    void dispatch_group_notify_f(dispatch_group_t group,dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    计划在一组先前提交的块对象完成时将应用程序定义的函数提交到队列。

    实例:

    7.

    void dispatch_group_enter(dispatch_group_tgroup);

    说明:

    显式指示块已进入组。

    实例:

    8.

    void dispatch_group_leave(dispatch_group_tgroup);

    说明:

    明确指示组中的块已完成。调用此函数会减少组中未完成任务的当前计数。使用此函数(with )允许应用程序正确管理任务引用计数,如果它通过除使用函数之外的方式显式添加和删除组中的任务。

    六:introspection.h

    1.

    void

    dispatch_introspection_hook_queue_create(dispatch_queue_t queue);

    2.

    void

    dispatch_introspection_hook_queue_destroy(dispatch_queue_t queue);

    3.

    void

    dispatch_introspection_hook_queue_item_enqueue(dispatch_queue_t queue,

    dispatch_object_t item);

    4.

    void

    dispatch_introspection_hook_queue_item_dequeue(dispatch_queue_t queue,

    dispatch_object_t item);

    5.

    void

    dispatch_introspection_hook_queue_item_complete(dispatch_object_t item);

    6.

    void

    dispatch_introspection_hook_queue_callout_begin(dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t function);

    7.

    void

    dispatch_introspection_hook_queue_callout_end(dispatch_queue_t queue,

    void*_Nullablecontext, dispatch_function_t function);

    七:io.h

    1.

    typedef int dispatch_fd_t;

    说明;

    用于I / O操作的文件描述符。

    2.

    void dispatch_read(dispatch_fd_t fd,size_t length,dispatch_queue_t queue,void(^handler)(dispatch_data_t data,int error));

    说明:

    使用指定的文件描述符计划异步读取操作。

    3.

    void dispatch_write(dispatch_fd_t fd,dispatch_data_t data,dispatch_queue_t queue,void(^handler)(dispatch_data_t_Nullabledata,interror));

    说明:

    使用指定的文件描述符计划异步写入操作。

    4.

    typedef unsigned long dispatch_io_type_t;

    说明:

    调度I / O通道的类型

    5.

    dispatch_io_t dispatch_io_create(dispatch_io_type_t type,dispatch_fd_t fd,dispatch_queue_t queue,void(^cleanup_handler)(interror));

    说明:

    创建调度I / O通道并将其与指定的文件描述符关联。 

    6.

    dispatch_io_t dispatch_io_create_with_path(dispatch_io_type_t type,const char *path,int oflag,mode_t mode,dispatch_queue_t queue,void(^cleanup_handler)(interror));

    说明:

    使用关联的路径名创建调度I / O通道。

    7.

    dispatch_io_t dispatch_io_create_with_io(dispatch_io_type_t type,dispatch_io_t io,dispatch_queue_t queue,void(^cleanup_handler)(interror));

    说明:

    从现有通道创建新的调度I / O通道。

    8.

    typedef void(^dispatch_io_handler_t)(bool done,dispatch_data_t_Nullabledata,

    int error);

    说明:

    用于处理调度I / O通道上的操作的处理程序块。调度I / O处理程序的参数如下:

    done - 表示操作是否完成的标志。

    data - 要处理的数据对象。系统会在处理程序执行期间保留此对象,并在处理程序块返回时释放该对象。

    error - 报告操作的错误编号(如果有)。错误号0通常表示操作成功。

    9.

    void dispatch_io_read(dispatch_io_t channel,off_toffset,size_tlength,dispatch_queue_t queue,dispatch_io_handler_t io_handler);

    说明:

    在指定通道上计划异步读取操作。

    10.

    void dispatch_io_write(dispatch_io_t channel,off_t offset,dispatch_data_t data,dispatch_queue_t queue,dispatch_io_handler_t io_handler);

    说明:

    为指定的通道安排异步写入操作。

    11.

    typedef unsigned long dispatch_io_close_flags_t;

    说明:

    用于指定通道关闭选项的标志类型。

    12.

    void dispatch_io_close(dispatch_io_t channel, dispatch_io_close_flags_t flags);

    说明:

    将指定通道关闭到新的读写操作。

    13.

    void dispatch_io_barrier(dispatch_io_t channel,dispatch_block_t barrier);

    说明:

    在指定的通道上安排屏障操作。

    14.

    dispatch_fd_t dispatch_io_get_descriptor(dispatch_io_t channel);

    说明:

    返回与指定通道关联的文件描述符。

    15.

    void dispatch_io_set_high_water(dispatch_io_t channel,size_t high_water);

    说明:

    设置在排队处理程序块之前要处理的最大字节数。

    16.

    void dispatch_io_set_low_water(dispatch_io_t channel,size_t low_water);

    说明:

    设置在排队处理程序块之前要处理的最小字节数。

    17.

    typedef unsigned long dispatch_io_interval_flags_t;

    说明:

    用于指定通道的调度间隔的标志的类型。

    18。

    void dispatch_io_set_interval(dispatch_io_t channel,uint64_t interval,dispatch_io_interval_flags_t flags);

    说明:

    设置调用通道的I / O处理程序的间隔(以纳秒为单位)。

    八:object.h

    1.

    void _dispatch_object_validate(dispatch_object_tobject) {

    void*isa = *(void*volatile*)(OS_OBJECT_BRIDGEvoid*)object;

    (void)isa;

    }

    2.

    typedef void(^dispatch_block_t)(void);

    3.

    void dispatch_retain(dispatch_object_t object);

    说明:

    增加调度对象的引用(保留)计数。

    4.

    void dispatch_release(dispatch_object_t object);

    说明:

    减少调度对象的引用(保留)计数。

    5.

    void *_Nullable dispatch_get_context(dispatch_object_t object);

    说明:

    返回对象的应用程序定义的上下文。

    6.

    void dispatch_set_context(dispatch_object_t object,void *_Nullable context);

    说明:

    将应用程序定义的上下文与对象相关联。

    7.

    void dispatch_set_finalizer_f(dispatch_object_t object,dispatch_function_t _Nullable finalizer);

    说明:

    设置调度对象的终结器函数。

    8.

    void dispatch_activate(dispatch_object_t object);

    说明:

    激活调度对象。

    9.

    void dispatch_suspend(dispatch_object_t object);

    说明:

    暂停调度对象上块对象的调用。

    10.

    void dispatch_resume(dispatch_object_t object);

    说明:

    恢复调度对象上块对象的调用。

    11.

    long dispatch_wait(void*object,dispatch_time_t timeout);

    说明:

    同步等待先前提交的块对象完成; 如果块在指定的超时时间段之前未完成,则返回。成功时返回零(与指定超时之前完成的组关联的所有块)或错误时返回非零(发生超时)。

    12.

    void dispatch_notify(void*object,dispatch_object_t queue,dispatch_block_t notification_block);

    说明:

    在一组先前提交的块对象完成时,计划要将块对象​​提交到队列。

    13.

    void dispatch_cancel(void*object);

    说明:

    异步取消指定的调度块。

    14.

    long dispatch_testcancel(void*object);

    说明:

    测试是否已取消给定的调度块。

    15.

    void dispatch_debug(dispatch_object_t object,const char * message, ...);

    说明:

    以编程方式记录有关调度对象的调试信息。已弃用。

    16.

    void dispatch_debugv(dispatch_object_t object,const char * message,va_list ap);

    说明:

    已弃用。

    九:once.h

    1.

    typedef long dispatch_once_t;

    说明:

    与函数一起使用的谓词。此类型的变量必须具有全局或静态范围。使用此类型进行自动或动态分配的结果是未定义的。

    2.

    void dispatch_once(dispatch_once_t*predicate,DISPATCH_NOESCAPE dispatch_block_t block);

    说明:

    在应用程序的生命周期内执行一次且仅执行一次块对象。

    3.

    void _dispatch_once(dispatch_once_t*predicate,DISPATCH_NOESCAPE dispatch_block_t block){

    if(DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {

    dispatch_once(predicate, block);

    }else{

    dispatch_compiler_barrier();

    }

    DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);

    }

    4.

    void dispatch_once_f(dispatch_once_t*predicate,void*_Nullablecontext,

    dispatch_function_t function);

    说明:

    在应用程序的生命周期内只执行一次应用程序定义的函数。

    5.

    void _dispatch_once_f(dispatch_once_t*predicate,void*_Nullablecontext,

    dispatch_function_t function)

    {

    if(DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {

    dispatch_once_f(predicate, context, function);

    }else{

    dispatch_compiler_barrier();

    }

    DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);

    }

    十:queue.h

    1.

    void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

    说明:

    在调度队列上提交异步执行块并立即返回。queue,提交块的队列。系统保留队列,直到块运行完成。这个参数不能NULL。block,要提交到目标调度队列的块。 此函数代表调用者执行Block_copy和Block_release。 此参数不能为NULL。调用此函数后,始终在提交块后立即返回,并且永远不会等待调用该块。目标队列确定是否相对于提交到同一队列的其他块串行或同时调用该块。独立的串行队列相互同时处理。

    实例:

    NSLog(@"123");

        dispatch_async(dispatch_get_global_queue(0, 0), ^{

            NSLog(@"456");

        });

        NSLog(@"789");

    打印:123,789,456

    2.

    void dispatch_async_f(dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    提交应用程序定义的函数以在调度队列上进行异步执行并立即返回。queue,要提交功能的队列。系统保留队列,直到该功能运行完成。这个参数不能NULL。context,应用程序定义的上下文参数传递给函数。work,应用程序定义的函数,用于在目标队列上调用。传递给此函数的第一个参数是context参数的值。这个参数不能NULL。

    3.

    void dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);

    说明:

    提交块对象以在调度队列上执行,并等待该块完成。queue,提交块的队列。这个参数不能NULL。block,要在目标调度队列上调用的块。这个参数不能NULL。

    实例:

    NSLog(@"123");

        dispatch_sync(dispatch_get_global_queue(0, 0), ^{

            NSLog(@"456");

        });

        NSLog(@"789");

    打印:123,456,789

    4.

    void dispatch_sync_f(dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    提交应用程序定义的函数以在调度队列上执行同步。

    5.

    void dispatch_apply(size_t iterations,dispatch_queue_t queue,DISPATCH_NOESCAPE void (^block)(size_t));

    说明:

    将块提交给调度队列以进行多次调用。

    size_t iterations: 执行的次数

    dispatch_queue_t queue: 提交的队列

    block 执行的任务

    size_t block中每次任务执行的索引

    实例:

    dispatch_apply(5, dispatch_get_global_queue(0, 0), ^(size_t index) {

            NSLog(@"66666,%ld",index);

        });

    打印:66666,0;66666,1;66666,2;66666,3;66666,4

    6.

    void dispatch_apply_f(size_t iterations,dispatch_queue_t queue,void *_Nullable context,void (*work)(void *_Nullable,size_t));

    说明:

    将应用程序定义的函数提交给多个调用的调度队列。

    7.

    dispatch_queue_t dispatch_get_current_queue(void);

    说明:

    返回正在运行当前正在执行的块的队列。已弃用。

    8.

    dispatch_queue_t dispatch_get_main_queue(void)

    {

    return DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q);

    }

    说明:

    返回与应用程序主线程关联的串行调度队列。

    9.

    typedef long dispatch_queue_priority_t;

    10.

    typedef qos_class_t dispatch_qos_class_t;

    11.

    typedef unsigned int dispatch_qos_class_t;

    12.

    dispatch_queue_t dispatch_get_global_queue(long identifier,unsigned long flags);

    说明:

    返回具有指定服务质量类的系统定义的全局并发队列。

    13.

    struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent;

    14.

    dispatch_queue_attr_t dispatch_queue_attr_make_initially_inactive(dispatch_queue_attr_t _Nullable attr);

    15.

    dispatch_queue_attr_t dispatch_queue_attr_make_with_autorelease_frequency(dispatch_queue_attr_t _Nullable attr,dispatch_autorelease_frequency_t frequency);

    16.

    dispatch_queue_attr_t dispatch_queue_attr_make_with_qos_class(dispatch_queue_attr_t_Nullableattr,dispatch_qos_class_tqos_class,intrelative_priority);

    说明:

    创建带有优先级的dispatch_queue_attr_t对象。通过这个对象可以自定义queue的优先级。

    17.

    dispatch_queue_t dispatch_queue_create_with_target(constchar*_Nullablelabel,dispatch_queue_attr_t _Nullable attr,dispatch_queue_t _Nullable target)DISPATCH_ALIAS_V2(dispatch_queue_create_with_target);

    18.

    dispatch_queue_t dispatch_queue_create(constchar*_Nullablelabel,dispatch_queue_attr_t _Nullable attr);

    说明:

    创建可以提交块的新调度队列。

    19.

    const char * dispatch_queue_get_label(dispatch_queue_t_Nullablequeue);

    说明:

    返回创建队列时为队列指定的标签。

    20.

    dispatch_qos_class_t dispatch_queue_get_qos_class(dispatch_queue_t queue,int*_Nullablerelative_priority_ptr);

    21.

    void dispatch_set_target_queue(dispatch_object_t object,dispatch_queue_t _Nullable queue);

    说明:

    设置给定对象的目标队列。

    用法一:改变dispatch_queue_create函数生成的Dispatch Queue的优先级。用法二:作成Dispatch Queue的执行阶层

    如果在多个Serial Dispatch Queue中用dispatch_set_target_queue函数指定目标位某一个Serial Dispatch Queue,那么原先本应并行执行的多个Serial Dispatch Queue,在目标Serial Dispatch Queue上只能同时执行一个处理。即先执行完一个队列里的任务,再执行另一个队列的任务。

    实例:

    1.

    dispatch_queue_tserialQueue = dispatch_queue_create("com.ios.oc",NULL);

    dispatch_queue_tglobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0); dispatch_set_target_queue(serialQueue, globalQueue);

    2.

    dispatch_queue_tserialQueue1 = dispatch_queue_create("com.ios.chen",NULL);

    dispatch_queue_tserialQueue2 = dispatch_queue_create("com.ios.zhen",NULL);

    dispatch_queue_ttargetQueue = dispatch_queue_create("com.ios.target",NULL); dispatch_set_target_queue(serialQueue1, targetQueue); 

     dispatch_set_target_queue(serialQueue2, targetQueue);

    dispatch_async(serialQueue1, ^{NSLog(@"s1 in");

     [NSThreadsleepForTimeInterval:1.f];NSLog(@"s1 out"); });

    dispatch_async(serialQueue2, ^{NSLog(@"s2 in"); 

     [NSThreadsleepForTimeInterval:1.f];NSLog(@"s2 out"); });

    打印:

    s1 in;s1 out;s2 in;s2 out;

    如果使用dispatch_set_target_queue,打印s1 in;s2 in;s2 out;s1 out;

    22.

    void dispatch_main(void);

    说明:

    执行提交到主队列的块。

    23.

    void dispatch_after(dispatch_time_t when,dispatch_queue_t queue,dispatch_block_t block);

    说明:

    延迟一段时间把一项任务提交到队列中执行,返回之后就不能取消,常用来在在主队列上延迟执行一项任务。

    实例:

    NSLog(@"开始");

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

            NSLog(@"12345");

        });

    24.

    void dispatch_after_f(dispatch_time_t when,dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    将应用程序定义的函数排入队列以便在指定时间执行。

    25.

    void dispatch_barrier_async(dispatch_queue_tqueue,dispatch_block_tblock);

    说明:

    提交用于异步执行的屏障块并立即返回。效果类似 dispatch_async,区别就是中间多了一个barrier,barrier顾名思义就是屏障的意思,将队列一分为2,前面的代码执行完才能执行。

    实例:

    dispatch_queue_t concurrent_queue = dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT);

        dispatch_async(concurrent_queue, ^(){

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

        });

        dispatch_async(concurrent_queue, ^(){

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

        });

        dispatch_async(concurrent_queue, ^(){

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

        });

        dispatch_barrier_sync(concurrent_queue, ^(){

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

        });

        dispatch_async(concurrent_queue, ^(){

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

        });

        dispatch_async(concurrent_queue, ^(){

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

        });

        dispatch_async(concurrent_queue, ^(){

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

        });

    task-1/2/3 和 task-4/5/6 分别并发执行,dispatch_barrier_async就像一座屏障,把1/2/3和4/5/6分隔开来,

    26.

    void dispatch_barrier_async_f(dispatch_queue_tqueue,void *_Nullable context,dispatch_function_t work);

    说明:

    提交用于异步执行的屏障函数并立即返回。

    27.

    void dispatch_barrier_sync(dispatch_queue_t queue,DISPATCH_NOESCAPE dispatch_block_t block);

    说明:

    提交屏障块对象以供执行,并等待该块完成。

    28.

    void dispatch_barrier_sync_f(dispatch_queue_t queue,void *_Nullable context,dispatch_function_t work);

    说明:

    提交屏障功能以执行并等待该功能完成。

    29.

    void dispatch_queue_set_specific(dispatch_queue_t queue,const void * key,void *_Nullable context,dispatch_function_t_Nullable destructor);

    说明:

    设置指定调度队列的键/值数据。

    30.

    void *_Nullable dispatch_queue_get_specific(dispatch_queue_t queue,const void * key);

    说明:

    获取与指定的调度队列关联的键的值。

    31.

    void *_Nullable dispatch_get_specific(const void * key);

    说明:

    返回与当前调度队列关联的键的值。

    32.

    void dispatch_assert_queue(dispatch_queue_t queue)DISPATCH_ALIAS_V2(dispatch_assert_queue);

    33.

    void dispatch_assert_queue_barrier(dispatch_queue_t queue);

    34.

    void dispatch_assert_queue_not(dispatch_queue_t queue)DISPATCH_ALIAS_V2(dispatch_assert_queue_not);

    十一:semaphore.h

    1.

    dispatch_semaphore_t dispatch_semaphore_create(long value);

    说明:

    创建具有初始值的新计数信号量。

    2.

    long dispatch_semaphore_wait(dispatch_semaphore_t dsema,dispatch_time_t timeout);

    说明:

    等待(递减)信号量。

    3.

    long dispatch_semaphore_signal(dispatch_semaphore_t dsema);

    说明:

    信号或增量,信号量。

    十二:source.h

    1.

    typedef const struct dispatch_source_type_s * dispatch_source_type_t;

    2.

    typedef unsigned long dispatch_source_mach_send_flags_t;

    3.

    typedef unsigned long dispatch_source_memorypressure_flags_t;

    4.

    typedef unsigned long dispatch_source_proc_flags_t;

    5.

    typedef unsigned long dispatch_source_vnode_flags_t;

    6.

    typedef unsigned long dispatch_source_timer_flags_t;

    7.

    dispatch_source_t dispatch_source_create(dispatch_source_type_ttype,uintptr_t handle,unsigned long mask,dispatch_queue_t _Nullable queue);

    说明:

    创建新的调度源以监视低级系统对象,并自动将处理程序块提交到调度队列以响应事件。

    8.

    void dispatch_source_set_event_handler(dispatch_source_t source,dispatch_block_t _Nullable handler);

    说明:

    为给定的调度源设置事件处理程序块。

    9.

    void dispatch_source_set_event_handler_f(dispatch_source_t source,dispatch_function_t _Nullable handler);

    说明:

    为给定的调度源设置事件处理函数。

    10.

    void dispatch_source_set_cancel_handler(dispatch_source_t source,dispatch_block_t _Nullable handler);

    说明:

    为给定的调度源设置取消处理程序块。

    11.

    void dispatch_source_set_cancel_handler_f(dispatch_source_t source,dispatch_function_t _Nullable handler);

    说明:

    设置给定调度源的取消处理函数。

    12.

    void dispatch_source_cancel(dispatch_source_t source);

    说明:

    异步取消调度源,防止进一步调用其事件处理程序块。

    13.

    long dispatch_source_testcancel(dispatch_source_t source);

    说明:

    测试给定的调度源是否已被取消。

    14.

    uintptr_t dispatch_source_get_handle(dispatch_source_t source);

    说明:

    返回与指定的调度源关联的基础系统句柄。

    15.

    unsigned long dispatch_source_get_mask(dispatch_source_t source);

    说明:

    返回调度源监视的事件掩码。

    16.

    unsigned long dispatch_source_get_data(dispatch_source_t source);

    说明:

    返回调度源的待处理数据。

    17.

    void dispatch_source_merge_data(dispatch_source_t source,unsigned long value);

    说明:

    合并数据转换成类型的调度源或和提交其事件处理程序块到它的目标队列。

    18.

    void dispatch_source_set_timer(dispatch_source_t source,dispatch_time_t start,uint64_tinterval,uint64_tleeway);

    说明:

    设置计时器源的开始时间,间隔和余地值。

    19.

    void dispatch_source_set_registration_handler(dispatch_source_t source,dispatch_block_t _Nullable handler);

    说明:

    为给定的调度源设置注册处理程序块。

    20.

    void dispatch_source_set_registration_handler_f(dispatch_source_t source,dispatch_function_t _Nullable handler);

    说明:

    设置给定调度源的注册处理函数。

    十三:time.h

    1.

    typedef uint64_t dispatch_time_t;

    2.

    dispatch_time_t dispatch_time(dispatch_time_t when,int64_t delta);

    说明:

    创建默认时钟的相对值或修改现有时钟

    3.

    dispatch_time_t dispatch_walltime(const struct timespec *_Nullable when,int64_t delta);

    说明:

    根据挂钟使用绝对时间创建

    相关文章

      网友评论

          本文标题:IOS GCD 分析

          本文链接:https://www.haomeiwen.com/subject/syfeuftx.html