在平时开发的时候,如果用延时操作时候,和[self performSelector:@selector(runItem1) withObject:nil afterDelay:3.0]
这个函数会经常打交道,这个函数的意思:把runItem1
函数放入当前的runloop
里等待执行。所以,如果是在子线程里,没有timer时候,使用这个方法会失效。
可以清楚的看到,他并没有执行。当然,子线程的时候你可以使用gcd
去做延时操作,例如:
当然,在子线程中,你可以使用
[self performSelectorOnMainThread:@selector(runItem1) withObject:nil waitUntilDone:YES];
回到主线程中调用方法。关于
waitUntilDone
设置为YES
的时候,下面的方法要等这个方法执行结束的时候再执行,设置为NO
的时候,则可以让下面的先执行。
很明显的,在设置为
YES
的时候,先执行runItem1
。当然,有对比才有伤害,_
可以看到是先执行了其他的方法,在执行
runItem1
。可以再明显一点。
因为都是在主线程中,所以对线程会有阻塞。
夏夏在看别人的代码的时候,调用delegate的时候,一般是这样的:
if ([delegate respondsToSelector:@selector(xxx)]) {
[delegate performSelector:@selector(xxx)withObject:self withObject:object];
}
然后夏夏的代码是这样的Orz:
[self.delegate valueChanged:_selectedNameArry imageArry:_selectedImgArry];
perform相比于直接调用,只要是运行时存在的函数,都可以用perform去调用,而且很显然,第一种方法比第二种健壮多了。
结束语
生命在于不断的学习,欢迎各位简友提意见哈,夏夏最近在学前端,难得有空,看看oc的资料~~