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多張圖片,滑動卡頓的現象,因為渲染圖片也會阻塞執行緒,可以建立觀察者,將任務加到陣列中一個一個載入
相關文章
- JavaScript for迴圈 執行順序JavaScript
- JavaScript如何中斷迴圈執行?JavaScript
- Casperjs迴圈執行(重複執行不退出)JS
- 多執行緒迴圈控制欄位失效造成死迴圈的坑執行緒
- JavaScript執行機制-node事件迴圈JavaScript事件
- 【轉】Promise迴圈序列執行寫法Promise
- 時間遞增迴圈執行指令碼指令碼
- (轉)Qt 的執行緒與事件迴圈QT執行緒事件
- C# 迴圈時,操作另外一個程式直到操作完成,迴圈繼續執行C#
- 多執行緒實現順序迴圈列印執行緒
- JavaScript 執行機制-瀏覽器事件迴圈JavaScript瀏覽器事件
- flutter: 執行緒通訊與訊息迴圈Flutter執行緒
- Java for迴圈中語句執行的順序Java
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- 多執行緒 HashMap 死迴圈 問題解析執行緒HashMap
- 三個執行緒迴圈列印123-多執行緒執行緒
- HashMap多執行緒下發生死迴圈的原因HashMap執行緒
- cmd執行python死迴圈怎麼解決Python
- 執行迴圈和自動釋放池關係
- 多執行緒下HashMap的死迴圈問題執行緒HashMap
- while(liunx,unix)中的迴圈執行某程式用法While
- JavaScript的map迴圈、forEach迴圈、filter迴圈、reduce迴圈、reduceRight迴圈JavaScriptFilter
- parallel: 一個簡單的並行執行Go迴圈的庫Parallel並行Go
- JavaScript for迴圈語句的執行順序和優化JavaScript優化
- EventLoopGroup事件迴圈組(執行緒組)繼承體系OOP事件執行緒繼承
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 事件迴圈 EventLoop(Promise,setTimeOut,async/await執行順序)事件OOPPromiseAI
- 【執行機制】 JavaScript的事件迴圈機制總結 eventLoopJavaScript事件OOP
- python重複執行10次for迴圈從0到9Python
- c# for(int i;i<3;i++)迴圈的執行次序C#
- Tcl編寫迴圈執行某個任務的指令碼指令碼
- 無限for迴圈(死迴圈)
- 【譯】理解Javascript函式執行—呼叫棧、事件迴圈、任務等JavaScript函式事件
- 為什麼對陣列排序讓Python迴圈執行更快陣列排序Python
- IL程式碼底層執行機制之迴圈處理 (轉)
- while迴圈以及do while迴圈While
- 迴圈
- if迴圈