原文網址:http://lysongzi.com/2016/01/30/iOS-%E5%BB%B6%E8%BF%9F%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93/
在實際應用中,有時候我們會需要延時執行某些操作,所以我們這里總結了四種延遲操作的方法,並簡要分析了每種方法的異同。
NSObject的相關方法
第一種方法是使用NSObject類的performSelector:withObject:afterDelay:
方法,該方法可以指定延遲一段時間后執行某個特定方法。這個方法必須在主線程中執行,否則會無效。同時該方法也是非阻塞的,無法取消延遲指向?(待考證)。
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0];
NSTimer
第二種方法可以使用NSTimer,該類也主要有三種方法生成一個NSTimer對象,其中我們可以更具需要選用合適的方法。通過該方法執行的延時操作需要在主線程中運行,也是非阻塞的方式。如果需要取消延遲執行操作,可以調用invalidate:
操作停止一個計時器對象。
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
GCD
通過GCD的方式執行延時操作是比較靈活的,因為這種方法既可以在主線程也可以在子線程上執行,且為非阻塞的方式,不足之處是尚無取消延遲操作的方法。
double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^{
[self delayMethod];
});
NSThread
這種方法是很簡單除暴的,就是讓線程休眠一段時間,然后再執行需要的操作。因此這種方法是阻塞式的,不推薦在主線程中使用,因為會造成UI卡頓。可以在子線程是使用。暫無取消方法。
[NSThread sleepForTimeInterval:1.0];
[self delayMethod];
Demon
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//第一種方法
//在主線程執行,否則無效;非阻塞;無法取消
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.0];
//第二種方法
//主線程中執行,否則無效;非阻塞;可以調用invalidate方法取消
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];
//第三種方法
//可選擇執行的線程;非阻塞;無法取消
double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^{
[self delayMethod];
});
//第四種方法
//主線程子線程都可以;阻塞;無法取消
[NSThread sleepForTimeInterval:1.0];
[self delayMethod];
}
- (void)delayMethod
{
NSLog(@"Excute.");
}
@end
然后哦我們可以看到結果輸出.
2016-01-30 20:54:27.822 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:27.830 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:28.820 DelayPerformSelector[2079:319217] Excute.
2016-01-30 20:54:29.818 DelayPerformSelector[2079:319217] Excute.