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在主線程創建了一個任務的定時調度。