- mvvm 开始
- 驱动者 viewmodel
- 控制器种 bindViewModel方法
- 大无语了 所有东西写在一块 多人开发怎么办
ViewModel
input: 输入
output:输出
transform:转换
网络请求 Moya
定义一个枚举
enum XyApi {
// 请求栏目
case getColumns(parentId: Int)
}
扩展遵守 TargetType
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
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))
添加 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
返回类型就是 Single <Response> Signle对象
public enum SingleTrait { }
public typealias Single<Element> = PrimitiveSequence<SingleTrait, Element>
基础模型定制 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)
获取年龄
age is 30
ViewModel 引入
就是把网络请求 获取 数据处理放到 viewModel中
BaseViewModel 引入 ErrorTracker.swift 然后 ErrorTracker.swift 依赖 Observable+Operators 和 Observable+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方法