performSelector withObject afterDelay 在子线程上调用不运行
2016-04-20 11:26
483 查看
如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在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
[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 在子线程上调用不运行
- java并发-Condition与Object.wait()、Object.notify()
- WaitForSingleObject与WaitForMultipleObjects用法详解
- Programming with Objective-C(二)
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
- Objective-C初学:属性
- OBJ-C简介部分学习笔记
- android ObjectAnimator基本应用
- 使用ObjectARX进行AutoCAD的二次开发 ——新建工程
- objective-C基础----字典,集合
- 自动滚动的 tableView 和高度自适应的 textView
- JavaScript之引用类型Object类型
- Objective-C 字典的基本用法(NSDictionary和NSMutableDictionary)
- JsonObject和JsonArray的使用
- Effective Object C 2.0——对象、消息和运行期
- 为什么JavaScript里面typeof(null)的值是"object"?
- css z-index之object flash修正
- 详解Objective-C runtime
- [HSON : HC Script Object Notation] Finish Build 1 On GitHub
- Objective-C Runtime能做什么?