概述
項目開發中經常會用到方法的延時調用,下面列舉常用的幾種實現方式:
1.performSelector
2.NSTimer
3.NSThread線程的sleep
4.GCD
1.performSelector
[self performSelector:@selector(delayMethod) withObject:nil/*可傳任意類型參數*/ afterDelay:2.0];
此方法是一種非阻塞的執行方式。
取消方法:
第一種:
/**
* 取消延遲執行
*
* @param aTarget 一般填self
* @param aSelector 延遲執行的方法
* @param anArgument 設置延遲執行時填寫的參數(必須和上面performSelector方法中的參數一樣)
*/
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
第二種:
//撤回全部申請延遲執行的方法
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
上面2種都是類方法,不能用實例對象去調用,只能用NSObject。
eg:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
2.NSTimer定時器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
此方法是一種非阻塞的執行方式
取消執行方法:[time invalidate];
3.NSThread線程的sleep
[NSThread sleepForTimeInterval:2.0];
此方法是一種阻塞執行方式,建議放在子線程中執行,否則會卡住界面。但有時還是需要阻塞執行,如進入歡迎界面需要沉睡3秒才進入主界面時。
沒有找到取消執行方式。
4.GCD
__block ViewController *weakSelf = self;
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[weakSelf delayMethod];
});
此方法可以在參數中選擇執行的線程,是一種非阻塞執行方式。因為該方法交給了GCD自動處理,因此不容易取消操作。