首頁  >  文章  >  iOS幾種延遲執行方法

iOS幾種延遲執行方法

(*-*)浩
(*-*)浩原創
2019-12-24 09:43:222937瀏覽

iOS幾種延遲執行方法

在專案開發中經常會用到方法的延時調用,具體的調用場景不做贅述,以下列舉現有的幾種實現方式:

方法一:performSelector                        (建議學習:phpstorm

[self performSelector:@selector(delayMethods) withObject:nil afterDelay:1.0];

#

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delayMethods) object:nil];

#
[NSObject cancelPreviousPerformRequestsWithTarget:self];
非阻塞執行方式,不會影響其他程序;必須在主執行緒中執行;

可以主動取消操作:

NSTimer *timer =  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(delayMethods) userInfo:nil repeats:NO];
如果要取消目前所有延時操作:

[timer invalidate];

註:該方法不夠安全,這個方法在呼叫時會設定目前runloop中的timer。但我們知道:只有主執行緒會在創建的時候預設自動執行一個runloop,並且含有timer,普通的子執行緒是沒有runloop和timer的。

所以在子執行緒中被呼叫的時候,我們的程式碼中延時操作的程式碼就會一直等待timer得調度,但是實際上子執行緒中沒有timer,這就會導致我們的延時操作程式碼永遠不會被執行。

方法二:NSTimer

[NSThread sleepForTimeInterval:1.0];
分析:

此方法是一種非阻塞執行方式,不會影響其他行程;必須在主執行緒中執行;預設為在主執行緒中設定一個定時器;可以設定是否重複執行延時操作;

#取消延時操作:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self delayMethods];
});
註:

若repeats參數設定為NO,執行完成後timer會自動銷毀,若repeats參數設定為YES,執行完成後,必須手動呼叫[timer invalidate]才能銷毀定時器;

方法三:sleep

dispatch_queue_t queen = dispatch_get_global_queue(0, 0);
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), queen, ^{
[self delayMethods];
});
分析:

這個方法是一種阻塞執行方式,最好放在子執行緒執行,否則會影響其他方法的執行。

方法四:GCD

__weak typeof(self) ws = self;
dispatch_queue_t queen = dispatch_get_global_queue(0, 0);
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queen);
if (timer) {
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 1.0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
[ws delayMethods];
});
dispatch_resume(timer);
}
分析:

此方法是一種非阻塞執行方式,不會影響其他進程;可以在參數中設定執行的進程:

rrreee也可以設定是否重複執行:

rrreee註:

因為方法交給了GCD自動處理,因此不容易取消操作###

以上是iOS幾種延遲執行方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn