通過 Moya+RxSwift+Argo 完成網絡請求

jopen 10年前發布 | 26K 次閱讀 Moya iOS開發 移動開發

最近在新項目中嘗試使用 Moya+RxSwift+Argo 進行網絡請求和解析,感覺還闊以,再來給大家安利一波。

Moya

Moya是一個基于Alamofire的更高層網絡請求封裝,深入學習請參見官方文檔:Moya/Docs

使用Moya之后網絡請求一般長了這樣:

</span>
provider.request(.UserProfile("ashfurrow")) { (data, statusCode, response, error) in
    if let data = data {
        // do something with the data
    }
}

Moya提供了很多不錯的特性,其中我感覺最棒的是stub,配合sampleData分分鐘就完成了單元測試:

</tr> </tbody> </table>

注意這里的MoyaProvider.ImmediatelyStub,我原以為它是個枚舉類型,看了MoyaProvider定義發現這里應該傳個closure,看了ImmediatelyStub的定義發現原來它是個類方法:

</span>
public typealias StubClosure = Target -> Moya.StubBehavior

override public init(stubClosure: StubClosure = MoyaProvider.NeverStub, ...) {

}

public final class func ImmediatelyStub(_: Target) -> Moya.StubBehavior { return .Immediate }</pre>
如果想打印每次請求的參數,在組裝endpoint的時候打印即可:

private func endpointMapping<Target: MoyaTarget>(target: Target) -> Endpoint<Target> {
    if let parameters = target.parameters {
        log.verbose("(parameters)")
    }
    return MoyaProvider.DefaultEndpointMapping(target)
}

private let provider = RxMoyaProvider<ItemAPI>(endpointClosure: endpointMapping)</pre>

RxSwift

RxSwift前面強行安利過兩波,在此不再贅述啦,Moya本身提供了RxSwift擴展,可以無縫銜接RxSwift和ReactiveCocoa,于是打開方式變成了這樣:

</span>
private let provider = RxMoyaProvider<ItemAPI>()
private var disposeBag = DisposeBag()

extension ItemAPI { static func getNewItems(completion: [Item] -> Void) { disposeBag = DisposeBag() provider .request(.GetItems()) .subscribe( onNext: { items in completion(items) } ) .addDisposableTo(disposeBag) } }</pre>

Moya的核心開發者、同時也是 Artsy 的成員:Ash Furrow, 在 AltConf 做過一次 《Functional Reactive Awesomeness With Swift》 的分享,推薦大家看一下,很可愛的!

Argo

Argo是thoughtbot開源的函數式JSON解析轉換庫。說到thoughtbot就不得不提他司關于JSON解析質量很高的一系列文章:

private let provider = MoyaProvider<ItemAPI>(stubClosure: MoyaProvider.ImmediatelyStub) 
  • sesese色