iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有一种延时,直接使用NSTimer来配置任务。

这两种方式都一个共同的前提,就是当前线程里面需要有一个运行的runloop并且这个runloop里面有一个timer。

我们知道:只有主线程会在创建的时候默认自动运行一个runloop,并且有timer,普通的子线程是没有这些的。这样就带来一个问题了,有些时候我们并不确定我们的模块是不是会异步调用到,而我们在写这样的延时调用的时候一般都不会去检查运行时的环境,这样在子线程中被调用的时候,我们的代码中的延时调用的代码就会一直等待timer的调度,但是实际上在子线程中又没有这样的timer,这样我们的代码就永远不会被调到。

下面的代码展示了performSelector和dispatch_time的不同

/*testDispatch_after 延时添加到队列*/
-(void) testDispatch_after{dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC);dispatch_after(time, dispatch_get_main_queue(), ^{NSLog(@"3秒后添加到队列");});
}
-(void) testDelay{NSLog(@"3秒后testDelay被执行");
}
/*dispatch_barrier_async 栅栏的作用*/
-(void) testDispatch_Barrier{//dispatch_queue_t gcd = dispatch_queue_create("这是序列队列", NULL);dispatch_queue_t gcd = dispatch_queue_create("这是并发队列", DISPATCH_QUEUE_CONCURRENT);dispatch_async(gcd, ^{NSLog(@"b0");//这个selector不会执行[self performSelector:@selector(testDelay) withObject:nil afterDelay:3];//代码会执行//[self testDispatch_after];});dispatch_release(gcd);
}

在有多线程操作的环境中, 这样performSelector的延时调用,其实是缺乏安全性的 。我们可以用另一套方案来解决这个问题,就是使用GCD中的dispatch_after来实现单次的延时调用

iOS多线程中performSelector: 和dispatch_time的不同相关推荐

  1. iOS 多线程:『GCD』详尽总结

    原文链接:www.jianshu.com/p/2d57c7201- 感谢大家对这篇文章的喜欢和支持.为了不辜负大家的喜欢,也为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我对这篇文章 ...

  2. iOS多线程:『pthread、NSThread』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> 本文用来介绍 iOS 多线程中,pthread.NSThread 的使用方法及实现. 第一部分:pthread 的使用.其他相 ...

  3. iOS多线程: pthread、NSThread

    系列文章: 多线程 多线程 pthread.NSThread 多线程 GCD 多线程 NSOperation 多线程运用 Pthreads 这是一套在很多操作系统上都通用的多线程API, 基于 c语言 ...

  4. iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    2019独角兽企业重金招聘Python工程师标准>>> iOS多线程:『NSOperation.NSOperationQueue』详尽总结 转载: 原地址https://www.ji ...

  5. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  6. iOS开发中多线程的那些事

    iOS开发深入之后还是要接触多线程和runloop的,写篇博客讲解.记录下iOS开发中的多线程技术. 线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比 ...

  7. ios 多线程gdc_GDC 2019中的Heretic,Megacity版本,实时光线追踪以及更多新闻

    ios 多线程gdc We kicked off GDC 2019 in the best way possible – with a keynote filled with major announ ...

  8. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

  9. iOS多线程拾贝------操作巨人编程

    iOS多线程拾贝------操作巨人编程 多线程 基本 实现方案:pthread - NSThread - GCD - NSOperation Pthread 多平台,可移植 c语言,要程序员管理生命 ...

最新文章

  1. javascript 学习三 语句
  2. linux maps,linux下/proc/pid/maps和pmap命令详解
  3. 郑州大学采用计算机,郑州大学计算机系作业
  4. Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
  5. pytorch深度学习_深度学习和PyTorch的推荐系统实施
  6. 计算机测试怎么提交,Win7电脑怎么测试上传速度?
  7. LeetCode 750. 角矩形的数量(DP)
  8. 实现数据库实时更新 jQuery Timers
  9. 汽车之家港股上市发行价定为176.3港元 募资35.6亿港元
  10. html的兼容有哪些,HTML里需要兼容验证的浏览器有哪些
  11. 超详细目标检测,yolo3训练自己的数据集
  12. idea 安装jrebel6.4.3及破解
  13. 硬件PCB发热严重,天线信号不良的整改
  14. 小米6刷miui12.5中出现网络问题(微信登不上等)的解决办法
  15. SAP 因谁而腾飞?NetApp
  16. bootstrap-select 的多选+模糊查询下拉框详解
  17. [HTML] 百度搜索框的基本实现 源码
  18. PyMol2.4安装教程
  19. Shiro实现多域名登录界面
  20. 如何检测新移动硬盘--HD Tune Pro硬盘工具

热门文章

  1. 中科院遗传发育所发表“重组菌群体系在根系微生物组研究中应用”的重要综述...
  2. R语言广义线性模型函数GLM、glm函数构建泊松回归模型(Poisson regression)、输出提供偏差(deviances)、回归参数和标准误差、以及系数的显著性p值
  3. R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)
  4. pandas将dataframe数据列中的年、月、日列组合成单一的日期数据列实战
  5. R语言deLong‘s test:通过统计学的角度来比较两个ROC曲线、检验两个ROC曲线的差异是否具有统计显著性
  6. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换
  7. Python中matplotlib默认绘制的条形图比较胖?如何设置成体型匀称的条形图,达到最佳的可视化效果。
  8. TED+肢体语言塑造你自己+power+fake it till you make it
  9. html验证用户名已存在,BootstrapValidator验证用户名已存在(Ajax)_亦心_前端开发者...
  10. laravel php跨域请求,Laravel 5.x设置跨域访问