yykit是一位大神出品的iOS开发三方库,本人计算机基础薄弱,在阅读源码过程中遇到一些困惑,自己在此作一些记录。今天就写一篇YYTimer的学习笔记。
#define LOCK(...) dispatch_semaphore_wait(_lock, DISPATCH_TIME_FOREVER); \
__VA_ARGS__; \
dispatch_semaphore_signal(_lock);
这个宏声明了一个LOCK的函数,(...)表示传递的是可变参数,这是c语言中的语法。__VA_ARGS__表示列出可变参数,在该代码中给LOCK传递的是表达式。首位两行的作用是防止多线程造成资源存取错误的一种同步机制。
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 如果semaphore计数大于等于1.计数-1,返回,程序继续运行。这里设置了一直等待。dispatch_semaphore_signal(semaphore);计数+1。这样一次只有一个线程可以进入执行代码。
_source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
dispatch_source_set_timer(_source, dispatch_time(DISPATCH_TIME_NOW, (start * NSEC_PER_SEC)), (interval * NSEC_PER_SEC), 0);
dispatch_source_set_event_handler(_source, ^{[_self fire];});
dispatch_resume(_source);
用dispatch_source在主线程创建了一个任务的定时调度。