1、方法一:使用dispatch_after
int64_t delayInSeconds = 10.0; // 延遲的時間
/*
*@parameter 1,時間參照,從此刻開始計時
*@parameter 2,延時多久,此處為秒級,還有納秒等。10ull * NSEC_PER_MSEC
*/
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// do something
});
2、方法二:使用performSelector
/**
* 延遲執行
*
* @param aSelector 方法名稱
* @param anArgument 要傳遞的參數,如果無參數,就設為nil
* @param delay 延遲的時間
*/
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay{}
調用如下:
[self performSelector:@selector(methodName) withObject:self afterDelay:0.25];
補充:
取消延遲執行的方法:
第一種:
/**
* 取消延遲執行
*
* @param aTarget 一般填self
* @param aSelector 延遲執行的方法
* @param anArgument 設置延遲執行時填寫的參數(必須和上面performSelector方法中的參數一樣)
*/
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
注意:這是一個類方法,不能用實例對象去調用,只能用NSObject。
第二種:
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
// 使用:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
這也是一個類方法,調用的話可以撤回全部申請延遲執行的方法。
還有兩個常用的方法:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
若wait是YES,則等待當前線程執行完以后,主線程才會執行aSelector方法;若wait是NO,則不等待當前線程執行完,就在主線程上執行aSelector方法。另外,如果當前線程是主線程,則立即執行aSelector方法。
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0);
在指定線程中執行aSelector方法。