开发中经常会遇到一种简单的同步问题:
系统在获取资源时,采用了block写法,外部逻辑需要的结果是在block回调中返回的
举个例子:
请求获取通讯录权限的系统弹窗
调用系统方法请求通讯录权限:

ABAddressBookRequestAccessWithCompletion(addressBook,^(bool granted,CFErrorRef
error))

外部需要操作通讯录实例addressBook,但这个实例是在block中返回的,如果不加同步判断的话,如果下一步执行了:

ABAddressBookGetPersonCount(addressBook)

则有可能会crash,原因是addressBook无效,为什么无效呢?是因为block中的代码块并不是同步执行的,调用ABAddressBookGetPersonCount(addressBook)的时候有可能根本就没有执行到block,所以addressBook此时并未被正确创建并初始化

如何解决这个问题?
采用如下写法,用信号量解决
dispatch_semaphore_t sema =dispatch_semaphore_create(0);
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool
granted, CFErrorRef error) {
   
dispatch_semaphore_signal(sema);
});
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);
原理:
先设置一个信号量,信号量为0;
执行block
当前线程调用完block,没有执行到block里面之前,都等待(wait在信号量为0的时候只会等待,在信号量>0的时候才会减一继续执行)
block执行完毕,最后执行signal,将信号量+1
wait到信号量>0,将信号量减一退出,继续执行下面的逻辑
如此一来,就保证了addressBook在真正使用之前已被正确创建并初始化,后面就可以放心的使用addressBook了
 

如何解决结果由block返回情况下的同步问题(转)的更多相关文章

  1. 解决redhat 没注册的情况下yum无法使用的问题

       官网下载的rhel,安装后是没有配置yum源的,需要自己配置yum源.网络上的很难找到rhel的yum源,但是在ISO镜像里面有很多redhat提供的软件包,也是正版软件,我们可以把这个拷贝出来 ...

  2. 把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

    .继上一篇随笔,链接点我,解决手机端cookie的问题. .上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的ur ...

  3. 解决并发情况下库存减为负数问题--update2016.04.24

    场景: 一个商品有库存,下单时先检查库存,如果>0,把库存-1然后下单,如果<=0,则不能下单,事务包含两条sql语句: ; update products ) WHERE id=; 在并 ...

  4. 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)

    使用springmvc框架开发了这么长时间,之前都是直接返回jsp页面,乱码情况都是通过配置和手动编解码来解决,但是今天突然返回一段单纯的字符串时,发现中文乱码情况解决不了了,下面就给各位分享一下如何 ...

  5. Linux开启SELinux的情况下怎么解决nginx403跟502错误

    https://www.cnblogs.com/caijt/p/10978324.html 以上篇博客中说了怎么在linux部署asp.net core  跟 nginx,里面成功的前提是把SElin ...

  6. 分库代价高的情况下,如何优化ES解决亿级数据量检索

    数据平台已迭代三个版本,从一开始遇到很多常见的难题,到现在终于有片段时间整理一些已完善的文档,在此分享以供所需朋友的实现参考,但愿能帮助大家少走些弯路,在此篇幅中偏重于ElasticSearch的优化 ...

  7. av_interleaved_write_frame 网络不好的情况下返回较慢

    用libvlc做直播推流引擎在网络较差的情况下,需要关闭直播,并且重新开播.这个过程中,推流引擎重启,需要的是快速响应.实际上测试结果发现,经常会发生引擎关闭接口卡住.后来跟踪代码,定位到s_rtmp ...

  8. 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值  ...

  9. ajax异步的问题,(主要解决有时候前台打断点和不打断点结果不一样的问题,一般情况下是存在异步的问题)

    一,代码 $(function() { $(".btn-submit").click(function() { if(!checkData()){ return; } var ur ...

随机推荐

  1. paper 124:【转载】无监督特征学习——Unsupervised feature learning and deep learning

    来源:http://blog.csdn.net/abcjennifer/article/details/7804962 无监督学习近年来很热,先后应用于computer vision, audio c ...

  2. 对jquery分页的升级

    以前写的分页用了好久了,但是分页时除了传页面外有时还要传一些其它参数,以前操作时要把传的参数放到隐藏hidden中,分页时在取出来,这样比较麻烦,今天无事,重新包装了一下 直接上代码吧 css用了bo ...

  3. 夺命雷公狗-----React_native---5---初步读懂代码模式

    我们的代码一般导出会用两种方式,如下所示: 这两种方法都是可以的.... 引入方式其实也是很简单的,如下所示: 这样即可...

  4. 亲手使用Sencha Touch + phonepag开发Web APP随笔 -- 环境安装篇

    最近因为有个项目需要制作APP,考虑到需要兼容Android和IOS,所以想采用WebAPP的方式来开发.现在是从零开始学习之路,走起-   通过网上博客和论坛,开始安装了一堆软件: 1. Sench ...

  5. iOS学习——制作一个小型加法计算器

    一.项目要求:制作一个加法计算器.在第1个和第2个文本框中输入两个整数,然后点击“计算”按钮,可将计算结果显示在第3个文本框中. 二.开发步骤: 1.搭建UI界面 2.监听按钮的点击事件 3.获取文本 ...

  6. express框架路由配置及congtroller自动加载

    express框架在node官方推荐的一个框架,关于如何入门的文章,已经很多了,我就不在累赘了,本文的核心是如何修改文件使得更接近一个MVC的框架 express原生是通过require的方式实现了模 ...

  7. CoreData 数据模型的版本控制

    CoreData 数据模型的版本控制 在项目中选择数据模型,然后选择Editor | Add Model Version 通过属性栏的ModelVersion current 选项进行版本的选择控制. ...

  8. AC6102 开发板千兆以太网UDP传输实验2

    AC6102 开发板千兆以太网UDP传输实验 在芯航线AC6102开发板上,设计了一路GMII接口的千兆以太网电路,通过该以太网电路,用户可以将FPGA采集或运算得到的数据传递给其他设备如PC或服务器 ...

  9. 关于yuv与rgb的互转

    来自以下网址:http://stackoverflow.com/questions/9465815/rgb-to-yuv420-algorithm-efficiency #define CLIP(X) ...

  10. ssh 配置config 别名

    打开shell 当前用户 cd ~ cd .ssh vim config Host (别名) User root(git)   登陆远程shell的用户 HostName 10.0.0.1 ip地址 ...