【发布时间】:2019-10-26 08:21:18
【问题描述】:
我有以下函数来执行 URL 请求:
final class ServiceManagerImpl: ServiceManager, ObservableObject {
private let session = URLSession.shared
func performRequest<T>(_ request: T) -> AnyPublisher<String?, APIError> where T : Request {
session.dataTaskPublisher(for: self.urlRequest(request))
.tryMap { data, response in
try self.validateResponse(response)
return String(data: data, encoding: .utf8)
}
.mapError { error in
return self.transformError(error)
}
.eraseToAnyPublisher()
}
}
有了以下两个函数,我现在可以从对应的ViewModel调用所需的请求:
final class AuditServiceImpl: AuditService {
private let serviceManager: ServiceManager = ServiceManagerImpl()
func emptyAction() -> AnyPublisher<String?, APIError> {
let request = AuditRequest(act: "", nonce: String.randomNumberGenerator)
return serviceManager.performRequest(request)
}
func burbleAction(offset: Int) -> AnyPublisher<String?, APIError> {
let request = AuditRequest(act: "burble", nonce: String.randomNumberGenerator, offset: offset)
return serviceManager.performRequest(request)
}
}
final class AuditViewModel: ObservableObject {
@Published var auditLog: String = ""
private let auditService: AuditService = AuditServiceImpl()
init() {
let timer = Timer(timeInterval: 5, repeats: true) { _ in
self.getBurbles()
}
RunLoop.main.add(timer, forMode: .common)
}
func getBurbles() {
auditService.emptyAction()
.flatMap { [unowned self] offset -> AnyPublisher<String?, APIError> in
let currentOffset = Int(offset?.unwrapped ?? "") ?? 0
return self.auditService.burbleAction(offset: currentOffset)
}
.receive(on: RunLoop.main)
.sink(receiveCompletion: { [unowned self] completion in
print(completion)
}, receiveValue: { [weak self] burbles in
self?.auditLog = burbles!
})
.store(in: &cancellableSet)
}
}
当我第一次使用self.getBurbles() 时,一切都很好。但是,对于接下来的调用,print(completion) 显示 finished,并且代码不会执行 self?.auditLog = burbles!
我不知道如何循环 getBurbles() 函数并以不同的时间间隔获得响应。
编辑
简而言之整个过程:
- 我从类初始化器调用
getBurbles() -
getBurbles()调用 2 个嵌套函数:emptyAction()和burbleAction(offset: Int) - 这两个函数产生不同的请求并调用
performRequest<T>(_ request: T) - 最后,我将响应设置为
auditLog变量并显示在SwiftUI 层
【问题讨论】:
-
不只是展示一些方法,你能清楚地知道这些方法各自属于哪个类吗?以及上课地点和方式?问题似乎在于您正在重用同一个发布者,但从这里很难判断。
-
@matt 请检查更新版本,希望现在很清楚