发布者失败时,合并接收器无法完成

时间:2020-01-19 12:04:28

标签: network-programming swiftui combine

我目前正在构建SwiftUI应用,并使用了来自github(GitHub/Squid)的网络库来实现api调用。

它工作正常,除非请求失败,然后库内部调试消息指示错误(在我的测试中为404),但是Combine订阅者从未收到完成信号。

我创建了一个新请求,该请求将尝试获取和解码“ jsonplaceholder.typicode.com”的用户。

import Foundation
import Squid

struct GetUsersFromMockApiRequest: JsonRequest {
    typealias Result = [User]

    var routes: HttpRoute {
        ["users"]
    }
}

用户只是一个简单的结构:

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)

但是,由于我缺乏调试和综合知识,因此之后很难投入。

0 个答案:

没有答案