在平時開發(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的資料~~