performSelector withObject afterDelay 在子線程上調用不運行

如題,這是最近在修改一個數據同步模塊時發現的問題。整個數據同步的任務是在App啓動後放在一個後臺執行的線程中的,執行某個單條數據同步任務成功後,會使用html

Objective-c代碼   收藏代碼
  1. [self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];  

 來執行下一個單條數據同步任務。經過調試,發如今執行到這行代碼的時候,並無調用 SEL 的方法。在肯定存在這個方法後,一直沒有想到緣由,因而就谷歌之。答案就是,performSelector withObject afterDelay 方法在子線程中,並不會調用SEL方法,而 performSelector withObject 方法會直接調用。緣由在於一下兩點:oop

一、afterDelay方式是使用當前線程的定時器在必定時間後調用SEL,NO AfterDelay方式是直接調用SEL。
二、子線程中默認是沒有定時器的。spa

 

因此,針對問題的解決方法也有兩種:線程

一、開啓線程的定時器調試

Objective-c代碼   收藏代碼
  1. [[NSRunLoop currentRunLoop] run];  

 

二、使用dispatch_after來執行定時任務orm

 

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.htmlhtm

相關文章
相關標籤/搜索