iOS performSelecter的简单应用

作者: __夏至未至 | 来源:发表于2016-06-22 16:13 被阅读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的资料~~

    相关文章

      网友评论

      • plantseeds:看别人也都是用的respondsToSelector+performSelector,但我还是不懂为啥perform比直接调用要好?
        b59457960ac9:@__夏至未至 个人觉得这个performSelector是判断delegate的这个selector有没被实现,如果有的话才调用下面的方法.我是这么理解的.
        plantseeds:@__夏至未至 66666
        __夏至未至:当你直接调用的时候,首先需要import或者在当前页面里面有这个方法,但是perform是利用runtime,主要运行时候有这个方法在可以直接调用

      本文标题:iOS performSelecter的简单应用

      本文链接:https://www.haomeiwen.com/subject/mwcndttx.html