performSelector afterDelay在子線程上調(diào)用不運行

平時我們想延遲一段代碼的運行,最簡單的方法就是使用 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 方法相當(dāng)于告訴當(dāng)前線程去直接去調(diào)用noDelayTest方法,noDelayTest方法當(dāng)然會被調(diào)用,

而performSelector afterDelay 相當(dāng)于 告訴當(dāng)前線程 用當(dāng)前線程的定時器去調(diào)用delayTest方法,但是我們知道,在子線程中,默認(rèn)是沒有定時器的,所以delayTest方法將沒有被調(diào)用的機(jī)會.

解決辦法

使用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];
??? });
}

結(jié)論

?1.performSelector 如果不使用延時,程序會再子線程上直接調(diào)用該方法,方法會被調(diào)用
?2.如果使用延時,在子線程中方法不會被調(diào)用,因為該方法等待定時器去調(diào)用,而該子線程中沒有定時器,所以不會調(diào)用
?3.解決2的方法就是使用dispatch_after里面會有一個定時器,來調(diào)用方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 進(jìn)程 什么是進(jìn)程 進(jìn)程是指在系統(tǒng)中正在運行的一個應(yīng)用程序 每個進(jìn)程之間是獨立的,每個進(jìn)程均運行在其專用且受保護(hù)的內(nèi)...
    45b645c5912e閱讀 511評論 0 5
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項。當(dāng)然也會給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 692評論 0 0
  • 準(zhǔn)備 Raspberry Pi 3B 開發(fā)板 微雪7'' HDMI樹莓派專用電容觸摸屏 Micro SD Card...
    qinwenbo閱讀 1,481評論 1 1
  • 不懷念你了,你已經(jīng)不是我認(rèn)識的人了 就這樣吧,那個QQ號我也不要了 嗯,后會無期。
    戲精w閱讀 205評論 0 0

友情鏈接更多精彩內(nèi)容