【发布时间】:2020-05-05 16:03:22
【问题描述】:
我目前正在构建一个 SwiftUI 应用程序并使用来自 github (GitHub/Squid) 的网络库来实现 api 调用。
它工作正常,除非请求失败,然后库内部调试消息指示错误(在我的测试中为 404),但合并订阅者从未收到完成信号。
我创建了一个新请求,它将尝试获取和解码“jsonplaceholder.typicode.com”的用户。
import Foundation
import Squid
struct GetUsersFromMockApiRequest: JsonRequest {
typealias Result = [User]
var routes: HttpRoute {
["users"]
}
}
User 只是一个简单的结构体:
struct User: Decodable {
let id: Int
let username: String
let name: String
}
在我的 ApiRequestManager.swift 文件中,我声明了一个函数来请求调度:
public func getUsersFromMockApi() -> Response<GetUsersFromMockApiRequest> {
return GetUsersFromMockApiRequest().schedule(with: ApiService(apiUrl: "jsonplaceholder.typicode.com"))
}
在我想调用 api 的地方,我有一个可取消集和一个 ApiRequestManager 实例。
@State private var cancellableSet: Set<AnyCancellable> = []
private let requestManager = ApiRequestManager()
现在最后一步是在按下按钮时调用一个函数,该函数执行以下代码:
self.requestManager.getUsersFromMockApi()
.print("Debug:")
.sink(receiveCompletion: { completion in
switch completion {
case .failure:
print("ApiCall failed.")
case .finished:
print("ApiCall finished.")
}
}) { result in
print("Received users from apiCall: \(result)")
}
.store(in: &cancellableSet)
如果 api 请求成功,一切正常。但是一旦它遇到任何错误,接收器就会收到任何信号/完成。
我尝试打印订阅者收到的每条消息,breakOnError 并一步一步地跟踪库以找出他是否甚至抛出错误。它会根据 NetworkScheduler.swift 文件中 schedule() 函数中接受的状态代码正确检查 HTTP 响应代码,并在第 285 行抛出自定义错误 throw Squid.Error.requestFailed(statusCode: statusCode, response: response.data)。
但是,由于我缺乏调试和组合知识,我很难在之后进行投掷。
【问题讨论】:
标签: network-programming swiftui combine