0

假设我想从 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 { event in case let .value(value): print(value) case let .failed(error): print(error) } 另外,如果我想执行另一个网络请求,我应该怎么做做?

任何帮助表示赞赏。

4

1 回答 1

3

正如评论中所讨论的,provider您的 SignalProducer 需要保持活动状态才能正常工作。为了避免将provider实例变量存储在某个地方,您也许可以按照 Matt Gallagher 在这篇 Cocoa with Love 帖子中的建议进行操作,即在您的闭包中放置withExtendedLifetime(provider) {}某个位置,flatMap以便在provider您的制作人还活着的时候保持活力。这基本上只是一种保留方式,provider编译器不会抱怨未使用的变量。

于 2017-05-05T13:05:43.623 回答