在我的案例中,SignalProducer没有使用ReactiveSwift启动

时间:2017-05-04 08:44:34

标签: reactive-cocoa reactive-swift

假设我想从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 {         活动在        case let .value(value):             打印(值)        case let .failed(error):            打印(错误)    } 还有什么,如果我想执行另一个网络请求,我该怎么办?

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

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