【问题标题】:Swift and Combine. Problems when I recover one record from a local service迅速和结合。从本地服务恢复一条记录时出现问题
【发布时间】:2021-01-31 19:33:40
【问题描述】:

我开始使用 swift 进行编程,但调用本地服务时遇到问题,例如:

{"idMember":14,"externalID":"001996.dce","email":null,"name":"Manu","isActive":true,"logDate":"2020-12-12 12:12:12","logUser":"asdasd"}

我试过了:

let url = URL(string: "http://localhost:8080/member/findByExternalID/001996.dce")!
let token = URLSession.shared.dataTaskPublisher(for: url)
           .map { $0.data }
           .decode(type: Member.self, decoder: JSONDecoder())
           .sink(receiveCompletion: { completion in
              print(completion)
            }, receiveValue: { value in
               print("service has \(value) value")
           })

会员.swift:

struct Member: Codable, Identifiable {
var id = UUID()
let idMember:Int
var name:String
    
var logDate:Date
var logUser:String

var externalID:String
var email:String
var isActive:Bool

enum CodingKeys: String, CodingKey {
    case idMember, name,  logDate,  logUser,  externalID, email, isActive }
}

但从不打印信息,从不调用服务(我在服务器日志中检查它)。我想这是一个微不足道的问题。但我没发现有什么问题。

【问题讨论】:

  • 你如何处理可取消的令牌?我看到您将它存储在 token 变量中,但之后会发生什么?请注意,如果此令牌被释放,您的数据任务将取消。
  • 我什么也不做。我试图简化我的代码来查找问题,我使用断点来观察令牌的值。我是否需要对令牌执行某些操作才能刷新它的值?

标签: swift rest combine


【解决方案1】:

token 是一个 AnyCancellable。如果它在实际联网有机会开始之前超出范围,它取消:这就是 AnyCancellable。因此,如果token 仅仅是一个局部变量,那么您的结果也就不足为奇了。您需要将token 存储在一个实例属性中,该属性可以在更高级别持续存在,足够长的时间以进行联网。

实际上,通常的做法不是将管道分配给某物,而是在.sink 之后添加.store 并将管道存储在Set<AnyCancellable> 实例属性或类似属性中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多