ios - PromiseKit 没有回调/解除分配?(阿拉莫菲尔)
问题描述
我的承诺链在解决之前就被破坏了(可能被解除分配)。当我因主机信任评估而使 Alamofire 请求失败时(目前仅)会发生这种情况 -> 强制评估失败,导致 -999 被取消等)。
设置相当简单:
API请求:
func start(_ onSuccess:@escaping SuccessBlock, onError:@escaping ErrorBlock) {
do {
try executeRequest { dataResponse in
self.onSuccess(dataResponse)
}
} catch {
self.onError(error)
}
}
其中 executeRequest() 是:
self.manager.request(request).responseJSON(queue: self.queue) { (response) in
completion(response)
}
然后,将 PromiseKit 包装器定义为 APIRequest 扩展:(无论哪种情况,此包装器回调都被正确调用)
func start() -> Promise<APIResponse> {
return Promise<APIResponse> { resolver in
self.start({ response in
resolver.fulfill(response)
}) { error in
resolver.reject(error)
}
}
}
最后,单元测试调用启动承诺(扩展):(流量永远不会到达这个地方,以防 Alamofire 失败)
request.start().done { response in
}.catch { error in
// not called if request failed
}
结果:如果请求失败 -> 扩展承诺包装器(catch)块被调用,但它不会传播回 UnitTest 承诺块。
只需用模拟实现替换 Alamofire 请求(这会触发一些其他错误(使所有设置按预期工作(单元测试完成并调用 catch 块等)例如:
DispatchQueue.global(qos: .default).asyncAfter(deadline: .now() + 2) {
let result = Alamofire.Result { () -> Any in
return try JSONSerialization.data(withJSONObject: [:], options: .fragmentsAllowed)
}
completion(DataResponse<Any>(request: nil, response: nil, data: nil, result: result))
}
这与Alamofire有关吗?我真的不知道如何处理那里的承诺(无论如何它们都不应该解除分配......或者PromiseKit中的这个错误?Alamofire?我还必须在应用程序本身中测试它(也许它是单元测试问题.. . )
查看相关问题 -> 我肯定会解决任何流程路径的承诺(履行/拒绝)。
我看不出 Alamofire 请求与 DispatchAsync 有何不同(后者按预期工作)。
解决方案
func start(_ onSuccess:@escaping SuccessBlock, onError:@escaping ErrorBlock) {
do {
try executeRequest { dataResponse in
onSuccess(dataResponse)
}
} catch {
onError(error)
}
}
您正在使用 self.onSuccess 这意味着它不是函数参数块,而是实例块,这就是为什么它不会从您调用开始时返回块。
推荐阅读
- python - Python,在不同对象上调用方法给出相同的结果
- angular - 如何将排序添加到 mat-list 中?
- ios - 从 ionic 项目中安全移除 UIWebView + 支持 iOS 10
- linux - 从 WSL 写入 Windows 磁盘(Linux 的 Windows 子系统)
- google-bigquery - 当我使用 Big Query Data Transfer 导入 DCM 数据时,点击次数和展示次数数据未导入
- android - Android Gradle:signingConfig.name 不能为空
- sql-server - 批量插入参数化存储过程 SQL 15
- python - 为什么我的代码在 zipfile 中重复
- php - 使用 PDO 和 SQL 将帖子添加到收藏夹
- ios - 使用_native_modules!跳过了 react-native 依赖 'react-native-beacons-manager'。未找到 podspec 文件