performSelector withObject afterDelay 在子线程上调用不运行
来源:互联网 发布:win7远程桌面端口 编辑:程序博客网 时间:2024/05/07 06:10
如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在App启动后放在一个后台执行的线程中的,执行某个单条数据同步任务成功后,会使用
[self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];
来执行下一个单条数据同步任务。通过调试,发现在执行到这行代码的时候,并没有调用 SEL 的方法。在确定存在这个方法后,一直没有想到原因,于是就谷歌之。答案就是,performSelector withObject afterDelay 方法在子线程中,并不会调用SEL方法,而 performSelector withObject 方法会直接调用。原因在于一下两点:
1、afterDelay方式是使用当前线程的定时器在一定时间后调用SEL,NO AfterDelay方式是直接调用SEL。
2、子线程中默认是没有定时器的。
所以,针对问题的解决方法也有两种:
1、开启线程的定时器
[[NSRunLoop currentRunLoop] run];
2、使用dispatch_after来执行定时任务
- (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 } }); }
0 0
- performSelector withObject afterDelay 在子线程上调用不运行
- performSelector withObject afterDelay 在子线程上调用不运行
- performSelector afterDelay在子线程上调用不运行
- performSelector:withObject:afterDelay:
- 延迟执行 [self performSelector: withObject: afterDelay: ];
- IOS学习之performSelector:withObject:afterDelay:
- iOS 取消延时执行 performSelector: withObject: afterDelay:
- [绍棠] performSelector:withObject:afterDelay: 延迟执行
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- 如何在 performSelector: withObject:afterDelay 的Object里传入多个参数
- 如何在 performSelector: withObject:afterDelay 的Object里传入多个参数
- performSelector:withObject:afterDelay: 精要概览(持续更新)
- [self performselector: withObject: afterDelay:];一定时间后执行某个方法
- 如何延迟执行一个block类似performSelector:withObject:afterDelay:?
- performSelector: withObject: afterDelay: 传递基本数据类型参数的bug
- - (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval
- poj1573Robot Motion
- java线程常见面试题
- Hibernate多对多配置
- 星历(Broadcast Ephemeris)与历书(Almanac)
- cloudstack 搭建总结
- performSelector withObject afterDelay 在子线程上调用不运行
- 一种服务器日志管理方法及系统
- WPF编译时提示"xxx不包含适合于入口点的静态 Main方法xxx"
- TurtleBot:从Hydro到Indigo的一些变更
- Struts2中属性驱动与模型驱动
- 多线程学习(十二)新特征-有返回值的线程
- HDU5592 ZYB's Premutation 树状数组应用
- DTU原理及基础知识
- AVFormatContext结构体源码解析