CFRunLoop 數據結構
屏幕快照 2018-11-27 下午6.32.48.png
屏幕快照 2018-11-27 下午6.33.18.png
CFRunLoopMode數據結構
屏幕快照 2018-11-27 下午6.35.28.png
name: NSDefaultRunLoopMode(對應mode名稱)
集合結構:
source0: 手動喚醒線程
source1: 具備喚醒線程的能力
數組結構:
CFRunLoopTimer : 基于事件的定時器
CFRunTimeObservers: 觀測時間點等
觀測時間點
觀測時間點
各個數據結構之前的關系
一對多關系
RunLoop的Mode
RunLoop的Mode 多種model
如何把一個timer添加到多個mode上 ???
NSRunLoopCommonModes的用途
事件循環的實現機制
事件循環的實現機制
RunLoop的核心
核心態到用戶態的切換
RunLoop與 NSTimer相關面試問題
如何把NSTimer同步添加到多個Mode上的??
把NSTimer同步添加到多個Mode源碼實現
添加commonMode
RunLoop和多線程相關問題
static NSThread *thread = nil;
// 標記是否要繼續事件循環
static BOOL runAlways = YES;
+ (NSThread *)threadForDispatch{
if (thread == nil) {
@synchronized(self) {
if (thread == nil) {
// 線程的創建
thread = [[NSThread alloc] initWithTarget:self selector:@selector(runRequest) object:nil];
[thread setName:@"com.imooc.thread"];
//啟動
[thread start];
}
}
}
return thread;
}
+ (void)runRequest
{
// 創建一個Source
CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
// 創建RunLoop,同時向RunLoop的DefaultMode下面添加Source
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
// 如果可以運行
while (runAlways) {
@autoreleasepool {
// 令當前RunLoop運行在DefaultMode下面
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1.0e10, true);
}
}
// 某一時機 靜態變量runAlways = NO時 可以保證跳出RunLoop,線程退出
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
}