【发布时间】:2017-05-04 08:44:33
【问题描述】:
假设我想从 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(值): 打印(值) 案例让.失败(错误): 打印(错误) } 另外,如果我想执行另一个网络请求,我该怎么办?
感谢任何帮助。
【问题讨论】:
-
您是否自行测试了
ReactiveSwiftMoyaProvider<UserService>以确保其正常工作? -
哦...谢谢!我找到了原因,
provider在函数调用后被销毁了。那么有什么建议可以延长SignalProducer的生命周期吗? -
你能发布一些关于
ReactiveSwiftMoyaProvider是如何实现的细节吗?在内存管理方面,我认为从getAuthorizationCode()返回的生产者应该通过flatMap保留来自provider.request(.authorization)的生产者。所以我认为provider必须以某种方式在取消初始化时处理生产者。 -
是的,看起来从
provider.request(.authorization)返回的生产者对提供者的引用很弱,因此它可以使用它来启动请求。我认为您只需要将提供者保留在物业中即可。如果您想聪明地避免使用存储的属性,也许您可以在flatMap闭包中捕获它,只要您的 SignalProducer 还活着,它就会一直保持活跃。
标签: reactive-cocoa reactive-swift