博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 在主线程操作UI不能保证安全
阅读量:6843 次
发布时间:2019-06-26

本文共 1063 字,大约阅读时间需要 3 分钟。

先看一下的一段代码

#ifndef dispatch_queue_async_safe#define dispatch_queue_async_safe(queue, block)\    if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(queue)) {\        block();\    } else {\        dispatch_async(queue, block);\    }#endif#ifndef dispatch_main_async_safe#define dispatch_main_async_safe(block) dispatch_queue_async_safe(dispatch_get_main_queue(), block)#endif复制代码

是不是很奇怪,一般来说下面的代码就足够了啊,可以保证在主线程运行

if ([NSThread isMainThread]) {       block();} else {   dispatch_async(dispatch_get_main_queue(), ^{       block();   })}复制代码

在上看到下面的讨论:


在非主队列中调用MKMapView的 addOverlay方法是不安全的,即使是在主线程,也有可能造成崩溃。

 I contacted Apple DTS, they confirmed it is a . But they also cautioned that the pattern of  and the  will likely run into more issues like this and the one reported by  above.

They also explicitly stated that main queue and the main thread are not the same thing, but are have subtle differences, as shown in my demo app.

在主队列中的任务,一定会放到主线程执行 所以只要是在主队列中的任务,既可以保证在主队列,也可以保证在主线程中执行。所以就可以通过判断当前队列是不是主队列来代替判断当前执行任务的线程是否是主线程,这样会更加安全。

转载地址:http://gvdul.baihongyu.com/

你可能感兴趣的文章
移动端小项目的小总结~
查看>>
【新知】 量子技术初探
查看>>
CentOS 6.9关闭NetworkManager服务
查看>>
大型分布式C++框架《二:大包处理过程》
查看>>
当前深度神经网络模型压缩和加速都有哪些方法?
查看>>
高并发场景之RabbitMQ篇
查看>>
改变你对世界看法的五大计算机视觉技术
查看>>
探寻教育信息化着力点,创新四川省教育厅IT管理
查看>>
iptables实现IP地址重定向(转发)
查看>>
军方让我做即时通讯,好好交代一下网络安全问题(附源码)
查看>>
11【在线日志分析】之redis-3.2.5 install(单节点)
查看>>
Uvaoj10054 - The Necklace
查看>>
玩转树莓派:OpenHAB的入门(二)
查看>>
.Net 中的序列化与反序列化 (转)
查看>>
linux系统管理 简单常用命令
查看>>
人工智能现在可以作画了
查看>>
重温.NET下Assembly的加载过程
查看>>
华先胜:城市大脑模仿者众多,揭秘阿里原版真正的技术实力
查看>>
使用 redis 缓存的经验
查看>>
udev安全补丁
查看>>