在我使用 ReactiveSwift 的情况下,SignalProducer 没有启动
SignalProducer does not started in my case using ReactiveSwift
假设我想从 UseDefaults 中读取一个值,如果它失败了,尝试向服务器请求它,我写了这段代码,但它不会执行:
func getAuthorizationCode() -> SignalProducer<String, MoyaError> {
if let authCode = UserDefaults.string(forKey: .authorizationCode) {
return SignalProducer(value: authCode)
}
let provider = ReactiveSwiftMoyaProvider<UserService>()
return provider.request(.authorization).flatMap(.concat) {
response -> SignalProducer<String, Moya.MoyaError> in
let json = JSON(data: response.data)
log.debug("Authorization response:\(json) ")
let authCode = json["authorizationcode"].stringValue
return SignalProducer(value: authCode)
}
}
getAuthorizationCode().start {
事件发生在
案例让.value(值):
打印(值)
案例让.failed(错误):
打印(错误)
}
另外,如果我想执行另一个网络请求,我该怎么办?
感谢任何帮助。
如评论中所述,provider
需要保持活动状态才能使 SignalProducer 正常工作。为了避免将 provider
存储在某处的实例 var 中,您可以按照 Matt Gallagher 在 this Cocoa with Love post 中的建议进行操作,即将 withExtendedLifetime(provider) {}
放在 flatMap
闭包中的某处只要您的制作人还活着,就可以让 provider
活着。这基本上只是一种保留 provider
而编译器不会抱怨未使用的变量的方法。
假设我想从 UseDefaults 中读取一个值,如果它失败了,尝试向服务器请求它,我写了这段代码,但它不会执行:
func getAuthorizationCode() -> SignalProducer<String, MoyaError> {
if let authCode = UserDefaults.string(forKey: .authorizationCode) {
return SignalProducer(value: authCode)
}
let provider = ReactiveSwiftMoyaProvider<UserService>()
return provider.request(.authorization).flatMap(.concat) {
response -> SignalProducer<String, Moya.MoyaError> in
let json = JSON(data: response.data)
log.debug("Authorization response:\(json) ")
let authCode = json["authorizationcode"].stringValue
return SignalProducer(value: authCode)
}
}
getAuthorizationCode().start { 事件发生在 案例让.value(值): 打印(值) 案例让.failed(错误): 打印(错误) } 另外,如果我想执行另一个网络请求,我该怎么办?
感谢任何帮助。
如评论中所述,provider
需要保持活动状态才能使 SignalProducer 正常工作。为了避免将 provider
存储在某处的实例 var 中,您可以按照 Matt Gallagher 在 this Cocoa with Love post 中的建议进行操作,即将 withExtendedLifetime(provider) {}
放在 flatMap
闭包中的某处只要您的制作人还活着,就可以让 provider
活着。这基本上只是一种保留 provider
而编译器不会抱怨未使用的变量的方法。