zoukankan      html  css  js  c++  java
  • performSelector withObject afterDelay 在子线程上调用不运行

    如题,这是最近在修改一个数据同步模块时发现的问题。整个数据同步的任务是在App启动后放在一个后台执行的线程中的,执行某个单条数据同步任务成功后,会使用

    Objective-c代码  收藏代码
    1. [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代码  收藏代码
    1. [[NSRunLoop currentRunLoop] run];  

    2、使用dispatch_after来执行定时任务

    Objective-c代码  收藏代码
      1. - (void)functionToDelay:(SEL)function param:(nullable id)param afterDelay:(NSTimeInterval)delay {  
      2.     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay*NSEC_PER_SEC);  
      3.     dispatch_after(time, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
      4.         if ([self respondsToSelector:function]) {  
      5. #pragma clang diagnostic push  
      6. #pragma clang diagnostic ignored "-Warc-performSelector-leaks"  
      7.         [self performSelector:function withObject:param];  
      8. #pragma clang diagnostic pop  
      9.   
      10.         }  
      11.     });     
      12. }  

    QQ技术交流群290551701  http://cxy.liuzhihengseo.com/556.html

  • 相关阅读:
    每日一题力扣222 完全二叉树节点的个数
    236 二叉树的最近公共祖先
    每日一题力扣122
    每日一题力扣 100 相同的树
    每日一题力扣617 合并二叉树
    每日一题力扣226
    每日一题力扣101 对称子树
    腾讯 qq 与 360 打架, 腾讯qq 无理
    决定把 blog 从 csdn.net 迁移到 cnblogs.com
    发现 google 网站管理员工具中给出的 javascript 代码是错误的
  • 原文地址:https://www.cnblogs.com/8hao/p/5411864.html
Copyright © 2011-2022 走看看