zoukankan      html  css  js  c++  java
  • performSelector 那点事

    1.performSelectorOnMainThread:withObject:waitUntilDone:

    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

    在主线程上执行指定的方法,使用默认的模式(NSDefaultRunLoopMode)。

    默认的模式指:主线程中的方法进行排队,是一个循环队列,并且循环执行。

    参数:

    aSelector:要在主线程执行的方法,该方法不能有返回值,并且只能有一个参数。

    arg:要传递的参数,如果无参数,就设为nil

    wait:要执行的aSelector方法,是否马上执行。

    如果设置为YES:等待当前线程执行完以后,主线程才会执行aSelector方法;

    设置为NO:不等待当前线程执行完,就在主线程上执行aSelector方法。

    如果,当前线程就是主线程,那么aSelector方法会马上执行。

    该方法用途:因为iPhone编程,对UI的修改,只能在主线程上执行。可以用该方法来完成UI的修改。

    2.performSelector:withObject:afterDelay:

    - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

    在当前线程中执行指定的方法,使用默认模式,并指定延迟。

    参数:

    aSelector:指定的方法。含义同上,不在赘述。

    anArgument:同上

    delay:指定延迟时间(秒)。

    3.performSelector

    我们常常用到以下3个方法,分别为:

    - (id)performSelector:(SEL)aSelector;

    - (id)performSelector:(SEL)aSelector withObject:(id)object;

    - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

    首先,定义要调用的方法

    - (void)methodNoParam{

        NSLog(@"methodNoParam");

    }

    - (void)methodWithOneParam:(id)paramFirst{

        NSLog(@"methodWithOneParam: %@", paramFirst);

        

    }

    - (void)methodWithParams:(id)paramFirst andParamSecond:(id) paramSecond{

         NSLog(@"methodWithOneParam: %@,%@", paramFirst,paramSecond);

               

    }

     
    其次,进行调用
     

    // 没有参数

        BOOL isNoParam= [self.selfViewControllerDelegaterespondsToSelector:@selector(methodNoParam)];

        if (isNoParam) {

            [self.selfViewControllerDelegateperformSelector:@selector(methodNoParam)];

        }

        

        // 一个参数

        BOOL isOneParam= [self.selfViewControllerDelegaterespondsToSelector:@selector(methodWithOneParam:)];

        if (isOneParam) {

            [self.selfViewControllerDelegateperformSelector:@selector(methodWithOneParam:) withObject:@"firsht"];

        }

        

        // 二个参数

        BOOL isParams= [self.selfViewControllerDelegaterespondsToSelector:@selector(methodWithParams: andParamSecond:)];

        if (isParams) {

            [self.selfViewControllerDelegateperformSelector:@selector(methodWithParams: andParamSecond:) withObject:@"first"withObject:@"second"];

        }

     
     
    So easy!!!

    补充:

    Run loop 相当于 win32 里面的消息循环机制,它可以让你根据事件/消息(鼠标消息,键盘消息,触摸事件,计时器消息等)来调度线程。 

    比如:在触摸 UIView 时之所以能够激发 touchesBegan/touchesMoved 等等函数被调用。系统会自动为应用程序的主线程生成一个与之对应的 run loop 来处理其消息循环。让调用更加简单。也避免了繁琐,复杂的操作。

    一句话:Run loop是一种消息处理机制!

  • 相关阅读:
    高性能解决线程饥饿的利器 StampedLock
    月初刚拿到美团offer,新鲜的美团现场面试41题(三面技术+HR面)
    这两份Java“并发+异步”编程宝典,堪称编程界的“瑰宝”
    阿里架构师的学习笔记:多线程+JVM+Mysql+Redis+设计模式
    打造多模块+高可用+高扩展Spring Cloud版分布式电商项目源码分享
    想要彻底搞懂微服务架构必先学:SpringBoot+SpringCloud+docker
    厉害了!阿里P8手写《springboot 核心》PDF来了
    阿里P8熬夜总结Spring源码笔记,上线3分钟“全网跪求”
    UFLDL课程学习(二)
    UFLDL课程学习(一)
  • 原文地址:https://www.cnblogs.com/ChouDanDan/p/5784280.html
Copyright © 2011-2022 走看看