iOS多執行緒的初步研究(四)-- NSTimer
理解run loop後,才能徹底理解NSTimer的實現原理,也就是說NSTimer實際上依賴run loop實現的。
先看看NSTimer的兩個常用方法:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成timer但不執行
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; //生成timer並且納入當前執行緒的run loop來執行
NSRunLoop與timer有關方法為:
- (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; //在run loop上註冊timer
主執行緒已經有run loop,所以NSTimer一般在主執行緒上執行都不必再呼叫addTimer:。但在非主執行緒上執行必須配置run loop,該執行緒的main方法示例程式碼如下:
- (void)main
{
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:myTimer forMode:NSDefaultRunLoopMode]; //實際上這步是不需要,scheduledTimerWithTimeInterval已經納入當前執行緒執行。如果使用timerWithTimeInterval則需要
while (condition)
[runLoop run];
}
實際上這個執行緒無法退出,因為有timer事件需要處理,[runLoop run]會一直無法返回。解決辦法就是設定一個截止時間:
[runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10.0]]; //每隔10秒檢查下執行緒迴圈條件,當然時間值可以根據實際情況來定。
我們通常在主執行緒中使用NSTimer,有個實際遇到的問題需要注意。當滑動介面時,系統為了更好地處理UI事件和滾動顯示,主執行緒runloop會暫時停止處理一些其它事件,這時主執行緒中執行的NSTimer就會被暫停。解決辦法就是改變NSTimer執行的mode(mode可以看成事件型別),不使用預設的NSDefaultRunLoopMode,而是改用NSRunLoopCommonModes,這樣主執行緒就會繼續處理NSTimer事件了。具體程式碼如下:
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
大家可以參看博文http://bluevt.org/?p=209,加深理解NSTimer和NSRunLoop的關係。
以前博文中提到延遲呼叫的方法,其實就是在當前執行緒的run loop上註冊timer來實現定時執行的。所以如果是在非主執行緒上使用,一定要有一個run loop。
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
相關文章
- iOS多執行緒的初步研究(三)-- NSRunLoopiOS執行緒OOP
- iOS多執行緒的初步研究(九)-- dispatch源iOS執行緒
- iOS 多執行緒的四種技術方案iOS執行緒
- 多執行緒學習初步(轉)執行緒
- 多執行緒(四)執行緒
- 對webWorker多執行緒效能的初步探索Web執行緒
- IOS多執行緒iOS執行緒
- iOS 多執行緒iOS執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- iOS多執行緒之執行緒安全iOS執行緒
- iOS多執行緒的使用iOS執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- iOS多執行緒整理iOS執行緒
- iOS-多執行緒iOS執行緒
- C#多執行緒學習(四) 多執行緒的自動管理(執行緒池)C#執行緒
- java基礎-多執行緒初步瞭解Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- 多執行緒系列(四):Task執行緒
- [iOS] 談談iOS多執行緒的鎖iOS執行緒
- iOS 多執行緒總結iOS執行緒
- iOS多執行緒GCD篇iOS執行緒GC
- iOS 多執行緒筆記iOS執行緒筆記
- IOS多執行緒之(GCD)iOS執行緒GC
- iOS 多執行緒之GCDiOS執行緒GC
- iOS 多執行緒介紹iOS執行緒
- iOS 多執行緒-學習iOS執行緒
- iOS多執行緒--NSThreadiOS執行緒thread
- iOS 多執行緒詳解iOS執行緒
- iOS 深入剖析多執行緒iOS執行緒
- iOS多執行緒調研iOS執行緒
- IOS下使用多執行緒iOS執行緒
- IOS 多執行緒技術iOS執行緒
- iOS多執行緒的那些事兒iOS執行緒
- iOS 開發中的多執行緒iOS執行緒
- 手撕Java多執行緒(四)執行緒之間的協作Java執行緒
- Java多執行緒(四):volatileJava執行緒
- 實戰.Net多執行緒(四)執行緒