xml地图|网站地图|网站标签 [设为首页] [加入收藏]

在子线程上调用不运行

来源:http://www.ccidsi.com 作者:集成经验 人气:104 发布时间:2020-04-20
摘要:前些天在拍卖按键三番四遍点击重新央求的主题材料,进行延期管理时,[selfperformSelector:@selector(setFjl_ignoreEvent:) withObject:@afterDelay:self.fjl_acceptEventInterval];。发今后实施到那行代码的时候

前些天在拍卖按键三番四遍点击重新央求的主题材料,进行延期管理时,[self performSelector:@selector(setFjl_ignoreEvent:) withObject:@ afterDelay:self.fjl_acceptEventInterval];。发今后实施到那行代码的时候,并从未调用 SEL 的措施。

performSelector withObject afterDelay 在子线程上调用不运营,performselector

如题,那是近日在修正两个数量同步模块时意识的标题。整个数据同步的职务是在App运维后放在三个后台推行的线程中的,实践有个别单条数据同步职分成功后,会利用

Objective-c代码  图片 1

  1. [self performSelector:(nonnull SEL) withObject:(nullable id) afterDelay:(NSTimeInterval)];  

 来实行下三个单条数据同步任务。通过调解,发今后举行到这行代码的时候,并从未调用 SEL 的措施。在鲜明存在此个方法后,平素未曾想到原因,于是就谷歌(Google卡塔尔之。答案正是,performSelector withObject afterDelay 方法在子线程中,并不会调用SEL方法,而 performSelector withObject 方法会间接调用。原因在于一下两点:

1、afterDelay方式是利用当前线程的电磁打点计时器在自然时间后调用SEL,NO AfterDelay形式是一向调用SEL。
2、子线程中默许是平昔不放大计时器的。

 

故而,针对难题的消除办法也是有三种:

1、开启线程的电火花计时器

Objective-c代码  图片 2

  1. [[NSRunLoop currentRunLoop] run];  

 

2、使用dispatch_after来实施按期职务

 

Objective-c代码  图片 3

  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  

withObject afterDelay 在子线程上调用不运维,performselector 如题,那是近来在改正三个多少同步模块时意识的主题素材。整个数据同步的...

//解决按钮连续点击问题- _fjl_sendAction:selector to:target forEvent:event{ if (self.fjl_ignoreEvent) return; if (self.fjl_acceptEventInterval > 0) { self.fjl_ignoreEvent = YES; [self performSelector:@selector(setFjl_ignoreEvent:) withObject:@ afterDelay:self.fjl_acceptEventInterval]; } [self _fjl_sendAction:selector to:target forEvent:event];}

此延迟方法没走,测验职员又发急测试,作者退换了一种延迟方法,使用了dispatch_after,运转了一晃,未有毛病了。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (self.fjl_acceptEventInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self setFjl_ignoreEvent:NO];});

本文由68399皇家赌场发布于集成经验,转载请注明出处:在子线程上调用不运行

关键词: 68399皇家赌场 线程 performSelec withObject

最火资讯