iOS performSelecter的简单应用

在平时开发的时候,如果用延时操作时候,和[self performSelector:@selector(runItem1) withObject:nil afterDelay:3.0]这个函数会经常打交道,这个函数的意思:把runItem1函数放入当前的runloop里等待执行。所以,如果是在子线程里,没有timer时候,使用这个方法会失效。

iOS performSelecter的简单应用_第1张图片
子线程调用Perform Delay.png

可以清楚的看到,他并没有执行。当然,子线程的时候你可以使用gcd去做延时操作,例如:

iOS performSelecter的简单应用_第2张图片
子线程的GCD延时.png

当然,在子线程中,你可以使用 [self performSelectorOnMainThread:@selector(runItem1) withObject:nil waitUntilDone:YES];回到主线程中调用方法。
关于 waitUntilDone设置为 YES的时候,下面的方法要等这个方法执行结束的时候再执行,设置为 NO的时候,则可以让下面的先执行。

iOS performSelecter的简单应用_第3张图片
YES.png

很明显的,在设置为 YES的时候,先执行 runItem1。当然,有对比才有伤害, _

iOS performSelecter的简单应用_第4张图片
NO.png

可以看到是先执行了其他的方法,在执行 runItem1。可以再明显一点。

iOS performSelecter的简单应用_第5张图片
NO delay3.png

因为都是在主线程中,所以对线程会有阻塞。
夏夏在看别人的代码的时候,调用delegate的时候,一般是这样的:

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

然后夏夏的代码是这样的Orz:

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

perform相比于直接调用,只要是运行时存在的函数,都可以用perform去调用,而且很显然,第一种方法比第二种健壮多了。

结束语

生命在于不断的学习,欢迎各位简友提意见哈,夏夏最近在学前端,难得有空,看看oc的资料~~

你可能感兴趣的:(iOS performSelecter的简单应用)