RxSwift + Moya + ObjectMapper

https://www.jianshu.com/p/173915b943af

use_frameworks!

target ‘RXDemo‘ do
    pod ‘RxSwift‘
    pod ‘RxCocoa‘
    pod ‘Moya-ObjectMapper/RxSwift‘
    pod ‘Moya/RxSwift‘
end

  

import Moya

let DouBanProvider = MoyaProvider<DouBanAPI>()

public enum DouBanAPI {
    case channels  //获取频道列表
    case playlist(String) //获取歌曲
}

extension DouBanAPI: TargetType {

    public var baseURL: URL {
        switch self {
        case .channels:
            return URL(string: "https://www.douban.com")!
        case .playlist(_):
            return URL(string: "https://douban.fm")!
        }
    }

    public var path: String {
        switch self {
        case .channels:
            return "/j/app/radio/channels"
        case .playlist(_):
            return "/j/mine/playlist"
        }
    }

    public var method: Moya.Method {
        return .get
    }

    public var task: Task {
        switch self {
        case .playlist(let channel):
            var params: [String: Any] = [:]
            params["channel"] = channel
            params["type"] = "n"
            params["from"] = "mainsite"
            return .requestParameters(parameters: params,
                                      encoding: URLEncoding.default)
        default:
            return .requestPlain
        }
    }

    public var validate: Bool {
        return false
    }

    public var sampleData: Data {
        return "{}".data(using: String.Encoding.utf8)!
    }

    public var headers: [String: String]? {
        return nil
    }
}
import UIKit
import ObjectMapper

//豆瓣接口模型
struct Douban: Mappable {
    //频道列表
    var channels: [Channel]?

    init?(map: Map) { }

    // Mappable
    mutating func mapping(map: Map) {
        channels <- map["channels"]
    }
}

//频道模型
struct Channel: Mappable {
    var name: String?
    var nameEn:String?
    var channelId: String?
    var seqId: Int?
    var abbrEn: String?

    init?(map: Map) { }

    // Mappable
    mutating func mapping(map: Map) {
        name <- map["name"]
        nameEn <- map["name_en"]
        channelId <- map["channel_id"]
        seqId <- map["seq_id"]
        abbrEn <- map["abbr_en"]
    }
}

//歌曲列表模型
struct Playlist: Mappable {
    var r: Int!
    var isShowQuickStart: Int!
    var song:[Song]!

    init?(map: Map) { }

    // Mappable
    mutating func mapping(map: Map) {
        r <- map["r"]
        isShowQuickStart <- map["is_show_quick_start"]
        song <- map["song"]
    }
}

//歌曲模型
struct Song: Mappable {
    var title: String!
    var artist: String!

    init?(map: Map) { }

    // Mappable
    mutating func mapping(map: Map) {
        title <- map["title"]
        artist <- map["artist"]
    }
}

  

  DouBanProvider.rx.request(.channels)
            .mapObject(Douban.self)
            .subscribe(onSuccess: { douban in
                if let channels = douban.channels {
                    print("--- 共\(channels.count)个频道 ---")
                    for channel in channels {
                        if let name = channel.name, let channelId = channel.channelId {
                            print("\(name) (id:\(channelId))")
                        }
                    }
                }
            }, onError: { error in
                print("数据请求失败!错误原因:", error)
            })
            .disposed(by: disposeBag)

  

  

原文地址:https://www.cnblogs.com/youhui/p/10268251.html

时间: 2024-10-17 01:50:02

RxSwift + Moya + ObjectMapper的相关文章

仿映客客户端、TableView多种动画效果、边缘返回手势等源码

iOS精选源码 相册多选框架 zhPopupController 简单快捷弹出自定义视图 tableView实现多种动画效果 自定义动画的PageControl 展示tableView和collectionView的结构,框架CHD_ListView_Structure RxSwift+Moya+ObjectMapper优雅的网络请求级模型转换 多种指示器文字效果源码SGPagingView react-native低仿映客直播客户端 支持iOS/Android ScreenEdgePanGes

moya 与 RxSwift 使用

如在OC中使用AFNetworking一般,Swift我们用Alamofire来做网络库.而Moya在Alamofire的基础上又封装了一层: 1.关于moya moya 官方说moya有以下特性-_-: 编译时检查正确的API端点访问. 使你定义不同端点枚举值对应相应的用途更加明晰. 提高测试地位从而使单元测试更加容易. 2.开始 1.创建枚举API 就像这样: enum APIManager { case getNewsLatest//获取最新消息 case getStartImage//

Swift网络请求(Moya篇)

在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等.但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题.Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置.具体的介绍可以参考Moya的官方链接,结构图如下: 接下来就介绍一下Moya的一些常见的用法: (一)根据

RxSwift 实战操作【注册登录】

前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是Carthage第三方管理工具导入的RxSwift3.0,关于Carthage的安装和使用,请参考Carthage的安装和使用. 最终效果 下载Demo点我 前提准备 首先请大家新建一个swift工程,然后把RxSwift引入到项目中,然后能够编译成功就行. 然后我们来分析下各个界面的需求: 注册界面

Alamofire +ObjectMapper模型: 上传单张图片,上传多张图片。

import Foundation import Alamofire //上传图片 ,multipartFormData 上传.key = attach extension HttpManager { /** 上传单张图片 - parameter image:   UIImage - parameter success: 成功回调图片 model - parameter failure: 失败 */ class func uploadSingleImage( _ image:UIImage, s

ReactiveCocoa / RxSwift 笔记一

原创:转载请注明出处 ReactiveCocoa / RxSwift Native app有很大一部分的时间是在等待事件发生,然后响应事件,比如 1.等待网络请求完成, 2.等待用户的操作, 3.等待某些状态值的改变等等, 等这些事件发生后,再做进一步处理 但是这些等待和响应,并没有一个统一的处理方式.Delegate, Notification, Block, KVO, 常常会不知道该用哪个最合适.有时需要chain或者compose某几个事件,就需要多个状态变量,而状态变量一多,复杂度也就上

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

RxSwift 系列(八)

前言 本篇文章我们将学习RxSwift中的错误处理,包括: catchErrorJustReturn catchError retry retry(_:) catchErrorJustReturn 遇到error事件的时候,返回一个值,并且结束.更多详情 let disposeBag = DisposeBag() let sequenceFail = PublishSubject<String>() sequenceFail.catchErrorJustReturn("??"

RxSwift 系列(一)

为什么使用RxSwift? 我们编写的代码绝大多数都涉及对外部事件的响应.当用户点击操作时,我们需要编写一个@IBAction事件来响应.我们需要观察通知,以检测键盘何时改变位置.当网络请求响应数据时,我们必须提供闭包来执行.我们使用KVO来检测变量的变化.所有这些不同的系统使我们的代码增加了不必要地复杂.如果有一个一致的系统来处理我们的所有的调用/响应代码,难道不是更好吗?Rx就是这样一个系统. RxSwift是用于大多数主要语言和平台的响应扩展(即Rx)的正式实现. 概念 每一个Observ