GCD(Dispatch I/O)

作者: _涼城 | 来源:发表于2016-07-18 09:35 被阅读1072次

    在读取较大的文件时,如果将文件分成合适的大小并使用 Global Dispatch Queue 并列读取的话,应该会比一般的读取速度快不少。 在 GCD 当中能实现这一功能的就是 Dispatch I/O 和 Dispatch Data。

    创建一个调度I / O通道。

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

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

    @Parameters


    type  通道类型 (Dispatch I/O Channel Types.)

    #define DISPATCH_IO_STREAM 0

    读写操作按顺序依次顺序进行。在读或写开始时,操作总是在文件指针位置读或写数据。读和写操作可以在同一个信道上同时进行。

    #define DISPATCH_IO_RANDOM 1

    随机访问文件。读和写操作可以同时执行这种类型的通道,文件描述符必须是可寻址的。


    fd 文件描述符


    queue  The dispatch queue


    cleanup_handler 发生错误时用来执行处理的 Block

    2.创建一个具有关联路径名的调度I / O通道。

    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)(int error));

    3.从现有的信道创建一个新的调度I / O信道。

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


    读写操作

    1.在指定的信道上调度异步读操作。

    void dispatch_io_read( dispatch_io_t channel, off_t offset, size_t length, dispatch_queue_t queue, dispatch_io_handler_t io_handler);

          dispatch_io_read 函数使用 Global Dispatch Queue 开始并列读取,每当各个分割的文件块读取结束时,将含有 Dispatch Data 传递给 dispatch 函数指定的读取结束时回调用的 Block。

    @Parameters


    channel 通道


    offset 对于DISPATCH_IO_RANDOM 类型的通道,此参数指定要读取的信道的偏移量。

              对于DISPATCH_IO_STREAM 类型的通道,此参数将被忽略,数据从当前位置读取。


    length 从通道读取的字节数。指定size_max继续读取数据直到达到一个EOF。

          如果处理程序与所做的参数设置为是的,一个空的数据对象,和一个0的错误代码,它意味着该通道达到了文件的结尾。

    2.为指定的信道调度一个异步写操作。

    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);

          该函数将指定的数据并提交io_handler块队列在操作的进度报告。如果处理程序的所做的参数设置为“不”,则意味着只有部分数据被写入。如果所做的参数设置为是的,这意味着写操作完成,处理程序将不会再次提交。如果操作成功,则处理程序的错误参数设置为0。


    设置一次读取的大小

    1.设置一次读取的最大字节

    void dispatch_io_set_high_water( dispatch_io_t channel, size_t high_water);

    2.设置一次读取的最小字节

    void dispatch_io_set_low_water( dispatch_io_t channel, size_t low_water);


    相关文章

      网友评论

        本文标题:GCD(Dispatch I/O)

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