iOS 多執行緒初步研究 NSTimer

2021-07-02 04:51:55 字數 1783 閱讀 5339

先看看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

[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:t

imer formode:

nsrunloopcommonmodes

];

大家可以參看博文加深理解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多執行緒的初步研究( ) NSTimer

先看看nstimer的兩個常用方法 nstimer timerwithtimeinterval nstimeinterval ti target id atarget selector sel aselector userinfo id userinfo repeats bool yesorno 生...

轉轉 iOS多執行緒的初步研究

ios多執行緒的初步研究 十 dispatch同步 ios多執行緒的初步研究 九 dispatch源 ios多執行緒的初步研究 八 dispatch佇列 ios多執行緒的初步研究 七 dispatch物件 ios多執行緒的初步研究 六 nsoperation ios多執行緒的初步研究 五 如何讓ns...

iOS多執行緒的初步研究(四) NSTimer

先看看nstimer的兩個常用方法 nstimer timerwithtimeinterval nstimeinterval ti target id atarget selector sel aselector userinfo id userinfo repeats bool yesorno 生...