iOS 知识点多线程GCD 队列 异步 网络 socket block 循环引用首页投稿(暂停使用,暂停投稿)

iOS performSelecter的简单应用

2016-06-22  本文已影响534人  __夏至未至

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

子线程调用Perform Delay.png

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

子线程的GCD延时.png
当然,在子线程中,你可以使用[self performSelectorOnMainThread:@selector(runItem1) withObject:nil waitUntilDone:YES];回到主线程中调用方法。
关于waitUntilDone设置为YES的时候,下面的方法要等这个方法执行结束的时候再执行,设置为NO的时候,则可以让下面的先执行。 YES.png
很明显的,在设置为YES的时候,先执行runItem1。当然,有对比才有伤害,_ NO.png
可以看到是先执行了其他的方法,在执行runItem1。可以再明显一点。 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的资料~~

上一篇下一篇

猜你喜欢

热点阅读