ios之GCD学习笔记(3)

来源:互联网 发布:郎咸平小三 知乎 编辑:程序博客网 时间:2024/04/28 02:28

 /*

     15、void dispatch_suspend(dispatch_object_t object)

            会令队列挂起,但并不意味代码不会执行,它会继续执行未完成的任务

            ,但是未开始的任务将不会被执行

     

            void dispatch_resume(dispatch_object_t object)

            唤醒挂起的队列

     */

    dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);    dispatch_async(myQueue, ^{        NSLog(@"呵呵");        sleep(1);        NSLog(@"呼呼");        dispatch_resume(myQueue);    });    dispatch_suspend(myQueue);    dispatch_async(myQueue, ^{        NSLog(@"哈哈"); //挂起之后加入,则不会被执行,直到被唤醒    });


    

    /*

     上述代码会相继打印 呵呵  呼呼 哈哈

     

     16、void dispatch_set_context(dispatch_object_t object, void *context);

     可以给队列设置一个上下文

    

      void * dispatch_get_context(dispatch_object_t object)

      可以获取队列设定的上下文

     

     注意:gcd不会帮我们释放上下文的内存

     

     17、 void dispatch_set_finalizer_f(dispatch_object_t object,dispatch_function_t finalizer);

     当队列的引用计数为0的时候,会调用fuction的方法,我们可以在该方法释放上下文内存

     

          void func_final(void * value)     {            value = nil;            NSLog(@"%@",value);     }          - (void)test{            dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);            NSString* str = [NSString stringWithFormat:@"%@",@"呵呵"];            dispatch_set_context(myQueue, (__bridge void*)str);            NSString* context = (__bridge NSString*)dispatch_get_context(myQueue);            NSLog(@"%@",context);            dispatch_set_finalizer_f(myQueue,func_final);     }


     

     18、dispatch_source_t 

            gcd中的定时器,文件监听,进程监听,Mach port监听

     

     19、dispatch_source_t dispatch_source_create(dispatch_source_type_t type,

                uintptr_t handle,unsigned long mask,dispatch_queue_t queue);

            创建一个dispatch_source_t

     

     第一个参数 监听的类型

 

  DISPATCH_SOURCE_TYPE_TIMER        定时响应     DISPATCH_SOURCE_TYPE_SIGNAL      接收到UNIX信号时响应     DISPATCH_SOURCE_TYPE_READ   IO操作,如对文件的操作、socket操作的读响应     DISPATCH_SOURCE_TYPE_WRITE     IO操作,如对文件的操作、socket操作的写响应     DISPATCH_SOURCE_TYPE_VNODE    文件状态监听,文件被删除、移动、重命名     DISPATCH_SOURCE_TYPE_PROC  进程监听,如进程的退出、创建一个或更多的子线程、进程收到UNIX信号     DISPATCH_SOURCE_TYPE_MACH_SEND     DISPATCH_SOURCE_TYPE_MACH_RECV   上面2个都属于Mach相关事件响应     DISPATCH_SOURCE_TYPE_DATA_ADD     DISPATCH_SOURCE_TYPE_DATA_OR          上面2个都属于自定义的事件,并且也是有自己来触发

 

     

     第二个参数:可以理解为句柄、索引或id,假如要监听进程,需要传入进程的ID

     第三个参数:可以理解为描述,提供更详细的描述,让它知道具体要监听什么

     第四个参数:当事件发生时,将block添加至哪个队列来执行

     */

  

  static dispatch_source_t timer;    timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));    

    /*

     20、void dispatch_source_set_timer(dispatch_source_t source,

     dispatch_time_t start,uint64_t interval,uint64_t leeway);

     设置timer属性

     第一个参数:timer (dispatch_source_t)

     第二个参数:开始时间(dispatch_time_t 第1篇讲过)

     第三个参数:间隔时间 单位是纳秒

     第四个参数:误差 通常写0

     

     说几个宏

     NSEC_PER_SEC 一秒等于多少纳秒(第1篇出现过)     NSEC_PER_MSEC 一毫秒等于多少纳秒     NSEC_PER_USEC 一微秒等于多少纳秒


     

     由于这是基于纳秒的定时器,所以上面的三个宏会经常用到

   

     换言之延迟一秒启动timer,相当于调用第一个timer,如果写0,会立马调用

     ,就达不到timer的效果

    */

    dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, 1.0*NSEC_PER_SEC);    uint64_t interver = 1.0*NSEC_PER_SEC;    dispatch_source_set_timer(timer,start,interver,0);

    /*

     21、void  dispatch_source_set_event_handler(dispatch_source_t source,dispatch_block_t handler);

     设置监听要执行的回调事件

     第一个参数:source

     第二个参数:回调

     */

    

dispatch_source_set_event_handler(timer,^{            });    dispatch_resume(timer);//注意:要想实现一个timer,必须调用dispatch_resume,并且将dispatch_source_t持有,否则你的timer无法启动,换言之timer不应该是局部变量    

    /*

     22、void dispatch_source_cancel(dispatch_source_t source);

     取消source

     */

   

 dispatch_source_cancel(timer);    

    /*

     23、void dispatch_source_set_cancel_handler(dispatch_source_t source,

     dispatch_block_t handler);

     设置取消的回调,当取消时候会调用handler

     */

    dispatch_source_set_cancel_handler(timer, ^{        timer = nil; //释放timer,或者关闭文件等等    });

    /*

     24、long dispatch_source_testcancel(dispatch_source_t source); 

     检测是否dispatch源被取消,如果返回非0值则表明dispatch源已经被取消

     */

    

long result = dispatch_source_testcancel(timer);    

    /*

     25、uintptr_t  dispatch_source_get_handle(dispatch_source_t source);

     获得create的第三个参数handle

     

     unsigned long dispatch_source_get_mask(dispatch_source_t source);

     获得create的第四个参数mask

     

     26、void dispatch_source_set_registration_handler(dispatch_source_t source, dispatch_block_t registration_handler);

     可用于设置dispatch源启动时调用block,调用完成后即释放这个block。也可在dispatch源运行当中随时调用这个函数。

     */

   

 dispatch_source_set_registration_handler(timer,^{    });


0 0
原创粉丝点击