您的位置:首页 > 运维架构

什么时候使用runloop 以及 performSelector 具体使用方法

2015-11-20 15:38 495 查看

runloop就不介绍了,度娘都告诉大家了,这里简单说一下什么时间点才使用runloop

首先run loop不需要创建,在线程中只需要调用[NSRunLoop currentRunLoop]就可以得到

如果你:

1. 使用port或是自定义的input source来和其他线程进行通信

2. 在线程(非主线程)中使用timer

3. 使用 performSelector…系列(如performSelectorOnThread, …)

4. 使用线程执行周期性工作

这些时候可以调用runloop
Run loop 是程序主线程基础设施的关键部分。所以,Cocoa 和 Carbon 程序提供了代码运行主程序的循环并自动启动 run loop。如果你使用 xcode 提供的模板创建你的程序,那你永远不需要自己去显 式的调用这些例程。
对于辅助线程,你需要判断一个 run loop 是否是必须的。如果是必须的,那么 你要自己配置并启动它。你不需要在任何情况下都去启动一个线程的 run loop。

 

performSelector这个方法对于初学者可能比较陌生,但是迟早你会遇到这个牛逼的方法,下面说一下关于performSelector都有哪些方法:

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

aSelector:方法名称

arg:参数(该方法有且只有一个参数,无参数可设为nil)

wait:BOOL值 当前线程若为主线程,aSelector立即执行;

当前若为分线程:YES:等待当前线程执行完毕,主线程执行aSelector;NO:aSelector立刻执行;

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

aSelector:方法名称

arg:参数(该方法有且只有一个参数,无参数可设为nil)
delay:aSelector方法延迟执行,单位(s)

注:以上在主线程上执行aSelector方法时,默认使用NSDefaultRunLoopMode模式;

3、performSelector可以访问未声明的方法

- (id)performSelector:(SEL)aSelector;

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

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

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];

    

    Person *person = [[Personalloc]
init];

    [person performSelector:@selector(eat)];

}

@end

Person.h

@interface Person :
NSObject

@end

Person.m

@implementation Person

void eat (idself,
SEL sel)

{

    NSLog(@"吃饭了");

}
@end
另两个方法就不赘述了,方法类似。

@end
@end
@end
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息