performSeletor:after与线程的关系

2018-09-10  本文已影响0人  草莓味辣妹

performSeletor:after

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

上述方法用于延迟执行一个函数,aSelector为需要延迟执行的函数名,anArgument为函数的参数,delay为延迟的时间

其原理是基于定时器,这就涉及到runloop和线程啦

该方法是在调用时向所在线程对应的runloop中加入定时器事件,

如果是在主线程调用performSeletor:after:函数,则向主线程的runloop中加入定时器事件

如果在子线程中调用performSeletor:after:函数,该方法会失效,即并不会执行需要延迟的函数,这是因为子线程的runloop默认不开启,所以无法添加定时器事件,因此延迟执行不生效

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleCleanFinished:) object:nil]

取消延迟执行的函数,参数应保持一致,否则无法取消。

值得注意的是,两个函数的执行应保持在同一个线程,否则取消延迟执行失效。

- (void)performSelector:(SEL)aSelector onThread:(NSThread*)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

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

上一篇 下一篇

猜你喜欢

热点阅读