iOS中定時器的使用

2021-06-27 00:16:58 字數 1962 閱讀 4742

定時器是開發中經常會接觸的乙個型別

蘋果公司在foundation框架中提供了乙個非常好用的定時器類——nstimer,幾乎可以完成所有的定時操作

nstimer 最常見的用法是,直接呼叫以下方法:

[nstimer scheduledtimerwithtimeinterval:1

target:self

selector:@selector(timeraction:)

userinfo:nil

repeats:yes];

這個方法的幾個引數,分別是:

time interval,定時器執行的時間間隔

target,是定時器作用的目標物件

selector,是方法選擇器,選擇定時呼叫的方法

user info,是傳遞到上述方法中的資訊

repeats,是否重複執行

這個類方法的返回值是nstimer,但是不接收該返回值,直接就可以啟動定時器。

呼叫上述方法之後,直接就會建立乙個定時器,然後這個定時器自動開始執行,每隔固定時間會呼叫定時器方法timeraction:

nstimer另外乙個類似的方法是

+ (nstimer *)timerwithtimeinterval:(nstimeinterval)ti target:(id)atarget selector:(sel)aselector userinfo:(id)userinfo repeats:(bool)yesorno;
直接呼叫這個方法也會建立乙個定時器,但是執行時,不會看到定時器的執行

nstimer *timer = [nstimer timerwithtimeinterval:1

target:self

selector:@selector(timeraction:)

userinfo:nil

repeats:yes];

需要自己手動開啟定時器,呼叫如下方法

[timer fire];
但是定時器依然不會啟動

因為oc中,定時器的啟動,是依賴於當前執行緒的事件迴圈的,也即nstimer的執行,需要依賴當前執行緒的run loop

所以上述定時器在啟動前,需要新增到乙個run loop中

如下:

[[nsrunloop currentrunloop] addtimer:timer formode:nsdefaultrunloopmode];

這樣再呼叫定時器的fire方法,就會啟動定時器。

其實將定時器新增到當前run loop之後,定時器在設定的時間間隔之後就會自動啟動,而fire方法,會立即觸發定時器

官方文件中說:

在重複執行的定時器中呼叫此方法後立即觸發該定時器,但不會中斷其之前的執行計畫;

在不重複執行的定時器中呼叫此方法,立即觸發後,就會使這個定時器失效。

所以nstimer的第乙個方法,其實做了如下幾件事情:

1. 建立乙個nstimer的定時器物件

2. 將這個定時器物件新增到當前執行緒的run loop上

3. 開啟這個定時器

所以新增的定時器會自動執行下去

而在一般的oc語言學習中,若想讓程式不斷執行,需要自己手動設定當前執行緒的runloop不斷執行

[[nsrunloop currentrunloop] run];

如果想停止定時器,只需要呼叫定時器的invalidate方法,就可以終止定時器,同時將定時器從當前run loop中移除

[timer invalidate];

注意:1. nstimer可以精確到50-100毫秒

2. nstimer並不是絕對精確的,因為它需要新增到當前執行緒上啟動,如果執行緒受阻,那麼定時器就租塞或者會跳過一段時間。

iOS中定時器NSTimer使用

呼叫一次計時器方法 cpp view plain copy mytimer nstimer scheduledtimerwithtimeinterval 1.5 target self selector selector scrolltimer userinfo nil repeats no 不重複...

iOS中的定時器

蘋果的定時器通常有兩種 nstimer和cadisplaylink nstimer用於計時精度不高的地方 nstimer scheduledtimerwithtimeinterval 0.1 target self selector selector setneedsdisplay userinfo...

IOS中定時器NSTimer

呼叫一次計時器方法 cpp view plain copy mytimer nstimer scheduledtimerwithtimeinterval 1.5 target self selector selector scrolltimer userinfo nil repeats no 不重複...