背景
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