- RunLoop的創(chuàng)建
- 可以認為所有線程的RunLoop都是懶加載的,直接使用currentRunLoop直接可以拿到當前線程的RunLoop對象,如果在mainThread中就拿到的是mainRunLoop,
其代碼分別如下 - 主線程
- 可以認為所有線程的RunLoop都是懶加載的,直接使用currentRunLoop直接可以拿到當前線程的RunLoop對象,如果在mainThread中就拿到的是mainRunLoop,
[NSRunLoop mainRunLoop];
CFRunLoopGetMain()
- 非主線程
[NSRunLoop currentRunLoop];
CFRunLoopGetCurrent();
- RunLoop的Mode
- Source:簡單來說分為Source0 和Source1
- Source0:非基于port的
- Source1:基于port的,一般情況下,Source1處理完以后交給Source0處理
- Observer
給一個RunLoop添加一個Observer:這里用的是CFRunLoop的函數,OC并沒有提供對應的API
```
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHander(kCFAllocatorDefault,kCFRunLoopAllActivities,YES,0,^(CFRunLoopObserverRef observer,CFRunLoopActivitity activity){
});
```
這里是創(chuàng)建一個observier,其中第二個參數需要監(jiān)聽的RunLoop的活動類型,Block是監(jiān)聽到RunLoop的活動回調的block

這張圖片就是官方文檔中RunLoop可以被監(jiān)聽的活動類型
CFRunLoopAddObserver(CFRunLoopGetCurrent(),observer,kCFRunLoopDefaultMode);
這里是給指定的RunLoop添加指定模式下的Observer
- 那么怎樣給一個線程添加一個RunLoop
- 方法一:
創(chuàng)建一個port是讓RunLoop有source而不至于銷毀
```
[[NSRunLoop currentRunLoop]addPort:[[NSPort alloc]init]forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentLoop]run];
這里還要注意的是,要手動調用run方法開啟RunLoop
- 方法二:
在一個while(1)循環(huán)中不斷的創(chuàng)建RunLoop,然后不斷銷毀的過程,知道RunLoop有了source才能循環(huán)
```
while(1)
{
[[NSRunLoop currentLoop]run];
}
```
- RunLoop的關閉
- 如果用OC的方法開啟的RunLoop因為沒有提供關閉的方法,因此一般情況下是無法關閉的,這里想要手動關閉,只能應用C語言函數去開啟和關閉
//C語言方式開啟RunLoop CFRunLoopRun(); //關閉 CFRunLoopStop(self.runLoop);
其實RunLoop涉及到的東西是非常多也是非常復雜的,今天就談一談一些常見的運用和個人淺薄的見解,望各位不吝改正和賜教
作者:胥鴻儒