一个网络请求的开始

338 阅读2分钟

ObjectMapper

  • mvvm 开始
  • 驱动者 viewmodel
  • 控制器种 bindViewModel方法
  • 大无语了 所有东西写在一块 多人开发怎么办

ViewModel

input: 输入

output:输出

transform:转换

网络请求 Moya

定义一个枚举

enum XyApi {
    // 请求栏目
    case getColumns(parentId: Int)
}

扩展遵守 TargetType

image.png

Method 报错

'Method' is ambiguous for type lookup in this context

在此上下文中,对于类型查找,“Method”不明确

修改 Moya.Method

import Foundation
import Moya

enum XyApi {
    // 请求栏目
    case getColumns(parentId: Int)
}

extension XyApi: TargetType {
    var baseURL: URL {
        return URL.init(string: "https://xxxxxx/")!
    }
    
    var path: String {
        return "/getColumns"
    }
    
    var method: Moya.Method {
        .get
    }
    
    var task: Task {
        return .requestParameters(parameters: ["page": "1"], encoding: URLEncoding.default)
    }
    
    var headers: [String : String]? {
        return ["Content-type": "application/json"]
    }
    
}

创建provider

image.png

Generic parameter 'Target' could not be inferred
无法推断泛型参数“Target”

所以传入一个 遵守target类型

let XyApiProvider = MoyaProvider<XyApi>()

网络请求

XyApiProvider.request(.getColumns(parentId: 0)) { result in
    switch result {
    case .success(let response):
        print(response.data)
        print(response.statusCode)
        do {
            let json = try JSONSerialization.jsonObject(with: response.data, options: .mutableContainers)
            print(json)
        } catch {
            print(response.statusCode)
        }
        break
    case .failure(let error):
        print(error)
        break
    }
}

do try

try? try! 都是有风险的

do {
    let json = try JSONSerialization.jsonObject(with: response.data, options: .mutableContainers)
    print(json)
} catch {
    print(response.statusCode)
}

Network再次封装 Rx

import RxMoya 可以用到

let json = XyApiProvider.rx.request(.getColumns(parentId: 0))

image.png

添加 RxSwift

  • 添加主调度
.observe(on: MainScheduler.instance)
  • disposed

实现 onDisposed 什么别加了

要么加个全局的

var disposeBag = DisposeBag()


let json = XyApiProvider.rx.request(.getColumns(parentId: 0)).observe(on: MainScheduler.instance)
_ = json.subscribe { response in
    print("1111")
    do {
        let json = try JSONSerialization.jsonObject(with: response.data, options: .mutableContainers)
        print(json)
    } catch {
        print(response.statusCode)
    }
} onFailure: { error in
    print("2222")
} onDisposed: {
    print("3333")
}.disposed(by: disposeBag)

返回json

封装Network

返回 Response

image.png

返回类型就是 Single <Response> Signle对象

public enum SingleTrait { }
public typealias Single<Element> = PrimitiveSequence<SingleTrait, Element>

image.png

基础模型定制 MoyaObjectMapper运用

必须给 Single <Response> 添加扩展 引入

坑爹啊 如果省略 onFailure 则 变成result了

记得 disposed

import RxSwift

声明变量
var dispoesdBag = DisposeBag()


.disposed(by: disposeBag)

RxCocoa

import RxCocoa

需要用到

BehaviorRelay 是个类 必须要有个范性

Driver 是个结构体

public typealias Driver<Element> = SharedSequence<DriverSharingStrategy, Element>


Shared Sequence 共享序列

BehaviorRelay (行为延迟) Driver 驾驶员

disposeBag

import RxSwift

var disposeBag = DisposeBag()

BehaviorRelay 创建驾驶员

var name: Driver<String>?

// 设置
name = BehaviorRelay(value: "首页").asDriver()

// 使用

name?.drive(onNext: { content in
            print(content)
        }, onCompleted: {
            PrintDebugLog("完成")
        }).disposed(by: disposeBag)
let br = BehaviorRelay<[String]>(value: [])
br.accept(["王盼盼","莫斯","哈哈"])
items = br


items?.asDriver(onErrorJustReturn: []).drive(onNext: { items in
    PrintDebugLog(items)
}, onCompleted: {
    PrintDebugLog("完成")
}).disposed(by: disposeBag)

获取年龄

image.png

age is 30

image.png

ViewModel 引入

就是把网络请求 获取 数据处理放到 viewModel中

BaseViewModel 引入 ErrorTracker.swift 然后 ErrorTracker.swift 依赖 Observable+OperatorsObservable+Logging

import Foundation
import RxSwift
protocol BaseViewModelType {
    associatedtype Input
    associatedtype Output
    func transform(input: Input) -> Output
}


class BaseViewModel: NSObject {
    var page = 0
    var disposeBag = DisposeBag()
    let loading = ActivityIndicator()
    let headerLoading = ActivityIndicator()
    let footerLoading = ActivityIndicator()
    let error = ErrorTracker()
    
    deinit {
        print("viewModel disposs")
    }
}

Input 和 Output 是范性 写好范性 在写transform方法

TabBarViewModel