Runloop-執行迴圈
Runloop的目的何在
-保證程式不退出
-負責監聽事件:觸控、時鐘、網路事件
-如果沒有事件發生,會讓程式進入休眠狀態!
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
//UITrackingRunLoopMode UI模式
//NSDefaultRunLoopMode 預設模式
//NSRunLoopCommonModes 佔位模式
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];
// [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
——如果只使用NSDefaultRunLoopMode,因為UI模式優先順序最高,所以當使用者觸控的時候觸發UI模式,則預設模式下的計時器則不會被響應
——如果用UITrackingRunLoopMode,觸控的時候觸發UI模式,則UI模式下的計時器也會被響應,但是當觸控取消的時候,計時器也不會被響應了,因為只有觸控才會觸發UI模式
——使用NSRunLoopCommonModes,可以完美解決
讓執行緒有執行不完的任務!!執行緒就不會釋放了!!!
一條執行緒上面的Runloop模式是不迴圈的
@interface ViewController ()
@property (nonatomic,assign) BOOL isFinish;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_isFinish = NO;
//子執行緒
NSThread *thread = [[NSThread alloc] initWithBlock:^{
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
//Runloop---一條執行緒上面的Runloop模式是不迴圈的
//最底層的 CFRunloop currentRunloop()第一次獲取Runloop的時候,建立Runloop
//[[NSRunLoop currentRunLoop] run];//死迴圈(這樣寫,執行緒幹不掉)
if (!_isFinish) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.00001]];
}
NSLog(@"來了!!");
// while(true){
// //從事件佇列中取出來事件來處理
// }
}];
[thread start];
}
- (void)timerMethod{
NSLog(@"%@",[NSThread currentThread]);
}
@end
runloop可以用來優化tableView上cell多張圖片,滑動卡頓的現象,因為渲染圖片也會阻塞執行緒,可以建立觀察者,將任務加到陣列中一個一個載入
相關文章
- for 迴圈執行流程
- JavaScript如何中斷迴圈執行?JavaScript
- JavaScript執行機制-node事件迴圈JavaScript事件
- 【轉】Promise迴圈序列執行寫法Promise
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- 三個執行緒迴圈列印123-多執行緒執行緒
- C# 迴圈時,操作另外一個程式直到操作完成,迴圈繼續執行C#
- JavaScript 執行機制-瀏覽器事件迴圈JavaScript瀏覽器事件
- 多執行緒實現順序迴圈列印執行緒
- flutter: 執行緒通訊與訊息迴圈Flutter執行緒
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- cmd執行python死迴圈怎麼解決Python
- Java for迴圈中語句執行的順序Java
- HashMap多執行緒下發生死迴圈的原因HashMap執行緒
- 事件迴圈 EventLoop(Promise,setTimeOut,async/await執行順序)事件OOPPromiseAI
- parallel: 一個簡單的並行執行Go迴圈的庫Parallel並行Go
- python重複執行10次for迴圈從0到9Python
- EventLoopGroup事件迴圈組(執行緒組)繼承體系OOP事件執行緒繼承
- 【執行機制】 JavaScript的事件迴圈機制總結 eventLoopJavaScript事件OOP
- for 迴圈與 while 迴圈While
- while迴圈 case迴圈While
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 【譯】理解Javascript函式執行—呼叫棧、事件迴圈、任務等JavaScript函式事件
- 無限for迴圈(死迴圈)
- Golang原始碼學習:排程邏輯(三)工作執行緒的執行流程與排程迴圈Golang原始碼執行緒
- while迴圈以及do while迴圈While
- if for迴圈
- For 迴圈
- if迴圈
- 迴圈
- for迴圈
- Python Basic - 遠端執行命令優化示例(迴圈接收直至接收完成)Python優化
- 04流程控制 for迴圈,while迴圈While
- 使用CountDownLatch或迴圈屏障對多執行緒程式碼進行單元測試 -XebiaCountDownLatch執行緒
- for迴圈、break和continue、二重迴圈
- 【基礎題】【for迴圈】二重迴圈
- 11C++迴圈結構-for迴圈(1)C++
- [譯]深入理解JavaScript函式執行—呼叫棧,事件迴圈和任務等JavaScript函式事件