iOS performSelecter的簡單應(yīng)用

在平時開發(fā)的時候,如果用延時操作時候,和[self performSelector:@selector(runItem1) withObject:nil afterDelay:3.0]這個函數(shù)會經(jīng)常打交道,這個函數(shù)的意思:把runItem1函數(shù)放入當(dāng)前的runloop里等待執(zhí)行。所以,如果是在子線程里,沒有timer時候,使用這個方法會失效。

子線程調(diào)用Perform Delay.png

可以清楚的看到,他并沒有執(zhí)行。當(dāng)然,子線程的時候你可以使用gcd去做延時操作,例如:

子線程的GCD延時.png

當(dāng)然,在子線程中,你可以使用[self performSelectorOnMainThread:@selector(runItem1) withObject:nil waitUntilDone:YES];回到主線程中調(diào)用方法。
關(guān)于waitUntilDone設(shè)置為YES的時候,下面的方法要等這個方法執(zhí)行結(jié)束的時候再執(zhí)行,設(shè)置為NO的時候,則可以讓下面的先執(zhí)行。

YES.png

很明顯的,在設(shè)置為YES的時候,先執(zhí)行runItem1。當(dāng)然,有對比才有傷害,_

NO.png

可以看到是先執(zhí)行了其他的方法,在執(zhí)行runItem1。可以再明顯一點(diǎn)。

NO delay3.png

因?yàn)槎际窃谥骶€程中,所以對線程會有阻塞。
夏夏在看別人的代碼的時候,調(diào)用delegate的時候,一般是這樣的:

if ([delegate respondsToSelector:@selector(xxx)]) {
    [delegate performSelector:@selector(xxx)withObject:self     withObject:object];
  }

然后夏夏的代碼是這樣的Orz:

[self.delegate valueChanged:_selectedNameArry imageArry:_selectedImgArry];

perform相比于直接調(diào)用,只要是運(yùn)行時存在的函數(shù),都可以用perform去調(diào)用,而且很顯然,第一種方法比第二種健壯多了。

結(jié)束語

生命在于不斷的學(xué)習(xí),歡迎各位簡友提意見哈,夏夏最近在學(xué)前端,難得有空,看看oc的資料~~

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

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

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