【问题标题】:SignalProducer does not started in my case using ReactiveSwift在我的情况下,SignalProducer 没有使用 ReactiveSwift 启动
【发布时间】: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&lt;UserService&gt; 以确保其正常工作?
  • 哦...谢谢!我找到了原因,provider 在函数调用后被销毁了。那么有什么建议可以延长SignalProducer 的生命周期吗?
  • 你能发布一些关于ReactiveSwiftMoyaProvider是如何实现的细节吗?在内存管理方面,我认为从getAuthorizationCode() 返回的生产者应该通过flatMap 保留来自provider.request(.authorization) 的生产者。所以我认为provider 必须以某种方式在取消初始化时处理生产者。
  • 是的,看起来从provider.request(.authorization) 返回的生产者对提供者的引用很弱,因此它可以使用它来启动请求。我认为您只需要将提供者保留在物业中即可。如果您想聪明地避免使用存储的属性,也许您可​​以在 flatMap 闭包中捕获它,只要您的 SignalProducer 还活着,它就会一直保持活跃。

标签: reactive-cocoa reactive-swift


【解决方案1】:

正如 cmets 中所讨论的,provider 需要保持活动状态,您的 SignalProducer 才能工作。为了避免将 provider 存储在某个实例 var 中,您可以执行 Matt Gallagher 在 this Cocoa with Love post 中建议的操作,即将 withExtendedLifetime(provider) {} 放在您的 flatMap 闭包中的某个位置,以保持 provider 活着你的制片人还活着。这基本上只是一种保留provider 的方法,而编译器不会抱怨未使用的变量。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 2014-03-26
相关资源
最近更新 更多