使用信号量使AFNetworking异步变同步(dispatch_semaphore_t)

2023-05-16

背景

  • 当H5调用OC的时候,默认是在主线程的,如果H5调用后,需要原生返回数据,而原生获取数据又是个耗时的异步操作就会有问题,比如OC是一个网络请求,那就需要等原生请求返回后,再返给H5。
  • 当然可以在网络请求返回的时候,调用H5的一个方法,但是觉得这样的实现方式有点low,所以还是想把网络请求改成同步,这样就可以解决这个问题了。

使用信号量来实现

  • 信号量的介绍
    正常的使用顺序是先降低然后再提高,这两个函数通常成对使用。
// 创建一个信号,value:信号量
dispatch_semaphore_create(<#long value#>)
// 使某个信号的信号量+1
dispatch_semaphore_signal(<#dispatch_semaphore_t dsema#>)
// 某个信号进行等待或等待降低信号量 timeout:等待时间,永远等待为 DISPATCH_TIME_FOREVER
dispatch_semaphore_wait(<#dispatch_semaphore_t dsema#>, <#dispatch_time_t timeout#>)
  • 实现
- (NSDictionary *)httpRequest {
    __block NSDictionary *response = @{};
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", nil];
    
    NSString *url = @"http:www.baidu.com";
    
    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        response = responseObject;
        NSLog(@"");
        dispatch_semaphore_signal(sem);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"");
        dispatch_semaphore_signal(sem);
    }];
    
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    return response;
}

但是发现不工作,表象就是线程卡住了。
后来翻看AFNetworking源码发现NSURLSessionTaskDelegate的代理方法中

NSURLSessionTaskDelegate

成功的回调是在主线程中执行的,但是此时的主线程已经被阻塞了,所以导致失败。

主线程
  • 解决办法就是给manager一个自己的线程
- (NSDictionary *)httpRequest {
    __block NSDictionary *response = @{};
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
    // 给manager一个自己的线程
    manager.completionQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", nil];
    
    NSString *url = @"http:www.baidu.com";
    
    [manager GET:url parameters:nil headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        response = responseObject;
        NSLog(@"");
        dispatch_semaphore_signal(sem);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"");
        dispatch_semaphore_signal(sem);
    }];
    
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    return response;
}

大功告成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用信号量使AFNetworking异步变同步(dispatch_semaphore_t) 的相关文章

随机推荐

  • Pytest测试框架基础篇

    今天和大家分享一下pytest测试框架的基础篇 xff0c 内容包括 xff1a 了解pytest测试框架的特点 掌握pytest基本使用 掌握pytest常用的场景 掌握pytest运行参数和配置方法 目录 一 测试框架的作用和类型 1
  • Pytest测试框架进阶篇

    今天和大家分享pytest测试框架进阶篇 xff0c 也可以称之为pytest测试框架核心 xff0c 主要核心有 xff1a 掌握pytest fixture 掌握pytest mark 目录 一 掌握pytest fixture 1 1
  • PowerDesigner--快速创建表模型生成SQL语句

    今天和大家分享一个我常用的设计表模型的工具PowserDesigner 选择物理模型 创建表 字段 索引等 梳理表之间的关系 一键生成SQL语句 目录 一 准备工作 二 选择物理模型 三 创建表 字段等 3 1 创建表 3 2 创建字段 3
  • python读取txt文件内容并进行分析

    今天和大家分享一下python如何读取txt文件内容并进行数据分析的 需求 某txt文件中存在很多数据 这些数据的某一个属性主要分为A B C D四类 xff0c 要求把数据分成四类求某一数值属性的平均值 xff0c 并统计生成超过平均值两
  • python脚本控制服务器---paramiko的使用

    今天和大家分享一个第三方库paramiko xff0c 主要应用场景是在实现自动化操作服务器时使用 xff0c 模拟我们手动登录服务器 输入cmd命令等操作 最后封装成自己的工具 xff0c 方便后面调用 目录 一 安装paramiko 二
  • Vim编辑器常用快捷方式

    这几天在学习shell编程 xff0c 其中常常会用到Linux下的vim编译器 xff0c 今天就总结一些在vim编辑器中常用的快捷键 xff0c 方便我们更好的使用 目录 一 vi编辑器基本概念 二 模式切换 三 编辑模式 四 命令行模
  • Linux面试相关知识点看着一文就够了

    今天和大家分享一下linux操作系统下主要用到的几个知识点 xff0c 分别是 xff1a linux目录结构 linux常用命令 文件权限操作 服务操作 yum安装命令 docker服务 vim编译器 pymysql测试连接 用户及组命令
  • Python对象比较及深浅拷贝

    今天和大家分享一个python语言中特别重要的一个知识点 xff0c 比较及拷贝 目录 一 61 61 和 is 二 深浅拷贝 2 1 浅拷贝 2 2 深拷贝 三 总结 一 61 61 和 is 等于 61 61 和is是Python中对象
  • python中的值传递和引用传递

    今天和大家分享python中很重要的一个知识点 xff1a 参数传递 xff0c 其中包括值传递和引用传递 目录 一 为什么要熟悉值传递和引用传递 1 1 值传递 1 2 引用传递 二 Python变量及其赋值 三 Python函数的参数传
  • MySQL8.0下DATE,DATETIME和TIMESTAMP的自动初始化和更新

    MySQL8 0下DATE DATETIME和TIMESTAMP的自动初始化和更新 DATE日期类型DATETIME和TIMESTAMP的不同什么是时区自动变动 xff1f DATETIME和TIMESTAMP的相同点微秒小数部分自动初始化
  • Python爬虫实战分析

    今天看到特别好的一篇文章 xff0c 分享给大家 从头到尾看了一遍 xff0c 以实战的例子分析爬虫所需要用到的知识点 十分受益 真可谓 xff1a python万能模板 xff0c 有了这个模板 xff0c 想爬取什么内容 xff0c 根
  • ansible dns

    1 详细叙述ansible的工作原理 工作原理 xff1a ansible是基于Python开发 xff0c 集合众多运维工具的优势 xff0c 实现批量的部署操作 xff0c ansible是基于模块化 xff0c 本身并没有部署能力 x
  • pip 安装命令 及 配置Path路径

    pip 不是内部或外部命令 也不是可运行的程序 或批处理文件 pip 安装命令 及 配置环境变量 numpy 输入pip install numpy 时 xff0c 提示 以numpy 为例 pip 不是内部或外部命令 也不是可运行的程序
  • 1-python工厂模式

    文章目录 工厂模式定义 xff1a 它的优点 xff1a 可以有如下三种实现方式1 简单工厂模式2 工厂方法模式3 抽象工厂模式总结 工厂模式定义 xff1a 在面向对象编程中 xff0c 术语 工厂 表示一个负责创建替他类型对象的类 通常
  • Facebook_Pop的使用指北

    背景 最近公司有了一个创新项目 xff0c 就是在视频视图之上添加一层视图 xff0c 视图设计涉及到了复杂的控件动画 xff0c 会根据视频的播放 xff0c 显示一些控件 xff0c 控件有位移 缩放 旋转 shake等动画 在网上调研
  • iOS Jenkins自动化打包 上传fir、蒲公英、邮件、钉钉提醒

    一 环境配置 注意 xff0c 本文章是以Jenkins2 263 4为例 1 首先安装Java环境 xff1a 官网下载地址 2 安装Jenkins 建议下载Jenkins 2 263 4版本 xff0c 因为最新版本存在login ke
  • iOS11 WKWebview App Crash闪退

    最近项目在iOS11 0 3 iOS11 1 2 iOS11 2 1 iOS 11 2 2 iOS11 2 6上面莫名其妙会崩溃 xff0c 本以为是block或者是设置User Agent导致的 xff0c 最后定位是Request设置u
  • iOS判断是否开启代理,防止Charles抓包

    直接检查是否设置了代理即可 BOOL checkProxySetting NSDictionary proxySettings 61 bridgeNSDictionary CFNetworkCopySystemProxySettings N
  • iOS 已有项目利用Pod集成RN

    一 背景 对于已经存在的iOS项目 xff0c 以模块化引入 xff0c OC与RN混编怎么做呢 xff1f 我们可以利用cocopods来集成 xff0c 直接使用pod install就可以让其他同事也快速集成 由于RN用npx rea
  • 使用信号量使AFNetworking异步变同步(dispatch_semaphore_t)

    背景 当H5调用OC的时候 xff0c 默认是在主线程的 xff0c 如果H5调用后 xff0c 需要原生返回数据 xff0c 而原生获取数据又是个耗时的异步操作就会有问题 xff0c 比如OC是一个网络请求 xff0c 那就需要等原生请求