performSelector withObject afterDelay 在子线程上调用不运行
Posted 刘星石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了performSelector withObject afterDelay 在子线程上调用不运行相关的知识,希望对你有一定的参考价值。
如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在App启动后放在一个后台执行的线程中的,执行某个单条数据同步任务成功后,会使用
Objective-c代码- [self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];
来执行下一个单条数据同步任务。通过调试,发现在执行到这行代码的时候,并没有调用 SEL 的方法。在确定存在这个方法后,一直没有想到原因,于是就谷歌之。答案就是,performSelector withObject afterDelay 方法在子线程中,并不会调用SEL方法,而 performSelector withObject 方法会直接调用。原因在于一下两点:
1、afterDelay方式是使用当前线程的定时器在一定时间后调用SEL,NO AfterDelay方式是直接调用SEL。
2、子线程中默认是没有定时器的。
所以,针对问题的解决方法也有两种:
1、开启线程的定时器
Objective-c代码- [[NSRunLoop currentRunLoop] run];
2、使用dispatch_after来执行定时任务
Objective-c代码
- - (void)functionToDelay:(SEL)function param:(nullable id)param afterDelay:(NSTimeInterval)delay
- dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay*NSEC_PER_SEC);
- dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
- if ([self respondsToSelector:function])
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- [self performSelector:function withObject:param];
- #pragma clang diagnostic pop
- );
QQ技术交流群290551701 http://cxy.liuzhihengseo.com/556.html
以上是关于performSelector withObject afterDelay 在子线程上调用不运行的主要内容,如果未能解决你的问题,请参考以下文章
performSelector:onThread 中断运行循环?