平時我們想延遲一段代碼的運行,最簡單的方法就是使用 performSelector afterDelay,但是你有沒有發(fā)現(xiàn)在子線程中調(diào)用這個方法,有時候延時執(zhí)行的代碼并沒有走,這是為什么呢?
我們先看一下下面的例子:
我們在.m文件里面加入如下方法
?? - (void)viewDidLoad {
??????? [super viewDidLoad];
??????? NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(threadRun) object:nil];
?? ? ?? [thread start];
}- (void)threadRun
{
??? [self performSelector:@selector(delayTest) withObject:nil afterDelay:0.2];???? //不會調(diào)用
??? [self performSelector:@selector(noDelayTest) withObject:nil];????????????? ? ? ? ?? //會調(diào)用
}
- (void)delayTest
{
??? NSLog(@"this is delayTest");
}
- (void)noDelayTest
{
??? NSLog(@"this is noDelayTest");
}
我們發(fā)現(xiàn),在0.2秒之后,delayTest方法并沒有走,而如果我們沒有使用afterDelay的noDelayTest 方法卻直接調(diào)用了,這是為什么呢棋弥?
其實performSelector 方法相當于告訴當前線程去直接去調(diào)用noDelayTest方法,noDelayTest方法當然會被調(diào)用攘乒,
而performSelector afterDelay 相當于 告訴當前線程 用當前線程的定時器去調(diào)用delayTest方法,但是我們知道,在子線程中,默認是沒有定時器的,所以delayTest方法將沒有被調(diào)用的機會.
解決辦法
使用dispatch_after代替performSelector afterDelay,具體如下
- (void)threadRun
{
??? //會調(diào)用
??? dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 0.2*NSEC_PER_SEC);
??? dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
??????? [self delayTest];
??? });
}
結論
?1.performSelector 如果不使用延時,程序會再子線程上直接調(diào)用該方法盼砍,方法會被調(diào)用
?2.如果使用延時,在子線程中方法不會被調(diào)用篮灼,因為該方法等待定時器去調(diào)用德频,而該子線程中沒有定時器鲜漩,所以不會調(diào)用
?3.解決2的方法就是使用dispatch_after里面會有一個定時器源譬,來調(diào)用方法