在專案開發中經常會用到方法的延時調用,具體的調用場景不做贅述,以下列舉現有的幾種實現方式:
方法一: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中文網其他相關文章!