一。举例说明 编程
[self performSelectorOnMainThread:@selector(RefreshCellForLiveId:) 多线程
withObject:userinfo 函数
waitUntilDone:YES]; oop
该方法的做用是在主线程中,执行制定的方法(代码块)。 spa
参数: 线程
@selector(RefreshCellForLiveId:)就是,要定义咱们要执行的方法。 orm
withObject:userinfo 对象
定义了,咱们执行RefreshCellForLiveId:方法时,传入的参数对象。类型是id。(咱们能够传入任何参数) 队列
waitUntilDone:YES]; 事件
指定,当前线程是否要被阻塞,直到主线程将咱们制定的代码块(RefreshCellForLiveId:方法)执行完。
注意:
1.当前线程为主线程的时候,waitUntilDone:YES参数无效。
2.该方法,没有返回值
3.该方法主要用来用主线程来修改页面UI的状态。
二。详细说明
在项目中,经常用到performSelectorXXX之类的方法,并且有不少相似方法;今天就来召集一下!
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;
这三个方法相同点都有一个要执行的方法,不一样之处在于参数个数不一样,参数个数分别为0,1,2。通常会先使用respondsToSelector方法判断是否能响应该某方法,能得话经过上面三个方法中的一个调用执行方法。
补充:
Run loop 至关于 win32 里面的消息循环机制,它可让你根据事件/消息(鼠标消息,键盘消息,触摸事件,计时器消息等)来调度线程。
好比:在触摸 UIView 时之因此可以激发 touchesBegan/touchesMoved 等等函数被调用。系统会自动为应用程序的主线程生成一个与之对应的 run loop 来处理其消息循环。让调用更加简单。也避免了繁琐,复杂的操做。
一句话:Run loop是一种消息处理机制!
三。后台前台的问题。
NSObject类的performSelectorOnMainThread和performSelectorInBackground能够实现简单的多线程编程技术
一、- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
建立一个线程在子线程执行,aSelector表明了新建立的线程,arg是传入的参数
二、- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
该方法的做用是在主线程中,执行制定的方法(代码块)。
参数:
@selector就是,要定义咱们要执行的方法。
withObject:arg定义了,咱们执行方法时,传入的参数对象。类型是id。(咱们能够传入任何参数)
waitUntilDone:YES指定,当前线程是否要被阻塞,直到主线程将咱们制定的代码块执行完。
注意:
1.当前线程为主线程的时候,waitUntilDone:YES参数无效。
2.该方法,没有返回值
3.该方法主要用来用主线程来修改页面UI的状态。