iOS-Telegraph异步响应实现

news/2024/7/20 21:30:16 标签: ios

背景

Telegraph该库只支持管理本地同步请求,为了长远打算,需要研究是否能使response异步回调的方法

参考gitHub-Telegraph文档

现象:根据文档说明和示例,以及查看源码实现确认该第三方库确实只支持管理本地同步的请求响应
它的实现原理是将需要发起请求的uri组装成一个Request请求类,然后添加到一个数组中作为缓存routers,当收到对应的请求,便去缓存的数组查找是否有对应的uri请求,有则使用Request请求类里的处理对象handle回调回去,然后触发外部添加的方法处理类,经过解析请求参数,回传结果数据(同步返回)

通过查看源码想通过修改源码看是否能实现,实际发现修改传入的响应参数类型貌似也不能成功,并且涉及到的改动类比较多,请求和响应的处理类比较困难。

解决方案一

经过查看github上问题反馈发现,之前早在19年的时候就有人提出这个问题,并且反馈给作者,作者回复说这个改动需要大量的(重新)架构和开发工作,经过一两年的时间仍然未改动,还得花更多的时间来研究这个问题。问题反馈描述
在这里插入图片描述

但幸运的是,虽然三方库不能直接支持异步的响应,但提出了一个可以在外部方法实现异步的方法:
通过使用DispatchGroup可以实现异步,也许对于可伸缩性/并发性来说不是最优的,但对于小型异步操作应该没问题
示例:经过测试能正常等待网络请求回来后,修改result参数,再返回

/// 保存用户选择的当前语言
    private func saveLanguageHandler(request: HTTPRequest) -> HTTPResponse {
        let json = JSON(request.body)
    
        var result = [String: Any]() /// 初始化时result为空
        let group = DispatchGroup()
        group.enter()
        DispatchQueue.global().async {
            SettingTool.uploadUserSetting{ (_) in
                result = ["wait": 1] /// 网络请求回来后赋值result为["wait": 1]
                group.leave()
            }
        }
        group.wait()
        return getOkResponse(data: result) /// 此时这里的result为["wait": 1]

在这里插入图片描述

结合实际项目综合考虑,本地服务的api请求大部分的情况下可以采用同步返回,异步返回的较少,如果后续有需求需要异步返回,可以通过上述方案实现

对比:

常用的本地服务第三方库包括Telegraph、cocoaHttpServer、GCDWebserver,各自的特点:
1、Telegraph:Swift版本,不支持异步响应,可支持https访问,可通过pod集成
2、cocoaHttpServer:OC版本,不支持异步响应,不支持pod集成,只能通过拉取代码文件集成
3、GCDWebserver:OC版本,支持异步响应,不支持https访问,可通过pod集成

待确认问题:GCDWebserver虽然是OC版本,不确认是否可以用于swift项目,根据github问题反馈得知该库对swift的兼容性不好

总结:

Swift项目推荐使用Telegraph
OC项目推荐使用GCDWebserver


http://www.niftyadmin.cn/n/347497.html

相关文章

类初始化过程

文章目录 类初始化过程实例初始化过程方法的重写Override代码测试 类初始化过程 一个类要创建实例需要先加载并初始化该类 main方法所在的类需要先加载和初始化 一个子类要初始化需要先初始化父类一个类初始化就是执行()方法 ()方法由静态类变量显示赋值代码和静态代码块组成类…

Jupyter notebook 和 Jupyter lab 的区别

Jupyter Notebook和JupyterLab都是用于交互式计算和数据科学的开源工具 它们都是基于Jupyter项目构建的,提供了一种以笔记本形式创建、运行和共享代码、文本和可视化结果的方式。然而,Jupyter Notebook和JupyterLab在用户界面、功能和扩展性方面存在一些…

探究企业角色权限管理的重要性及实践方法

角色权限管理是企业网盘工具中的重要功能。它是指将特定角色分配给用户,然后根据用户的工作要求为这些角色分配访问权限的过程。通过使用基于角色的权限,组织可以确保员工只能访问执行工作职责所需的文件和文件夹。那么企业角色权限管理有必要吗&#xf…

【实施】畅捷通T+软件生产成本结转的理解

【项目场景】 在公司涉及到有生产的业务过程中, 针对生产升本结转的各项环节与理解。 【实施讲解】 在整个生产过程中,针对生产成本结转主要分为三个步骤; 步骤一: 日常发生的所有制造费用,借制造费用,比…

【Linux】权限管理,谁动了我代码?!

目录 一,shell命令以及运行原理 二 ,Linux用户权限 1. su —— 用户切换 三,权限管理 1. 理解 2. 用户 3. 文件类型 4. 文件基本权限 5. 设置文件权限方法 1. chmod —— 修改文件访问权限 2. chown —— 修改文件拥有者 3. chg…

根据视频直播流获取一个视频下载到本地

根据视频直播流获取一个视频下载到本地 视频流为一段视频流,比如直播的历史数据,我们获取的是摄像头的历史数据 import java.awt.Dimension; import java.awt.image.BufferedImage;import com.tlzn.tkwl.util.StringUtil; import org.bytedeco.javacpp.a…

煤矿电子封条系统 yolov7网络模型

煤矿电子封条系统通过yolov7网络模型算法,煤矿电子封条系统可以实现对煤矿井下人员的出入管理,提高对煤矿井下人员的监管效果。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将对计算层的所有计算块应用相同的组参数和通道乘数。然后&…

QObject: Cannot create children for a parent that is in a different thread

在Qt的官方文档,大家知道有两种方式使用 QThread。 You can use worker objects by moving them to the thread using QObject::moveToThread().Another way to make code run in a separate thread, is to subclass QThread and reimplement run().在使用MoveToThread这种方式…