performSelector withObject afterDelay 在子线程上调用不运行

    如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值