zoukankan      html  css  js  c++  java
  • 如何解决结果由block返回情况下的同步问题(转)

    开发中经常会遇到一种简单的同步问题:
    系统在获取资源时,采用了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
     
  • 相关阅读:
    时间管理的心理建设与优先矩阵
    在oracle中计算时间差
    android环境搭建
    有效沟通的六个步骤
    5招教你把握Java性能监控(转自51testing)
    选项卡TabHost
    Excel导入导出数据库02
    画廊视图Gallery
    拖动条SeekBar及星级评分条
    在应用程序级别之外使用注册为allowDefinition='MachineToApplication' 的节是错误的
  • 原文地址:https://www.cnblogs.com/1024Planet/p/6197471.html
Copyright © 2011-2022 走看看