第37月第16天 rxswift
1.
let disposeBag = DisposeBag() // 1 let o1 = Student(score: Variable(1)) let o2 = Student(score: Variable(2)) let o3 = Student(score: Variable(4)) // 2 let student = PublishSubject<Student>() // 3 student.asObservable() .flatMapLatest { $0.score.asObservable() } .map { $0 * 10 } .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) student.onNext(o1) student.onNext(o2) o1.score.value = 3 student.onNext(o3) o2.score.value = 5 o3.score.value = 6 student.onCompleted()
https://segmentfault.com/a/1190000011450314
3,materialize
- 该操作符可以将序列产生的事件,转换成元素。
- 通常一个有限的 Observable 将产生零个或者多个 onNext 事件,最后产生一个 onCompleted 或者 onError 事件。而 materialize 操作符会将 Observable 产生的这些事件全部转换成元素,然后发送出来。
AudioProvider
.fetchAudioBanners()
.materialize()
.elements()
.subscribeNext(weak: self) { (self) in
return { (resps) in
print(resps)
}
}
.disposed(by: disposeBag)
let disposeBag = DisposeBag() let refreshRelay = PublishSubject<Void>() let refresh = refreshRelay .asObservable() .share() refresh.subscribe {(event) in print(event) }.disposed(by: disposeBag) refreshRelay.onNext(Void())
https://www.bilibili.com/video/av44971632/?p=10
https://www.hangge.com/blog/cache/detail_1950.html
3.
1)Value of type 'Observable<Event<[MusicSheetInfo]>>' has no member 'elements'
public func elements() -> Observable<E.ElementType> { return filter { $0.event.element != nil } .map { $0.event.element! } }
2)subscribeNext
public func subscribeNext<A: AnyObject>(weak obj: A, _ onNext: @escaping (A) -> (Self.E) -> Void) -> Disposable { return self.subscribe(onNext: weakify(obj, method: onNext)) }
pod 'RxSwiftExt', '~> 3.4.0'
let disposeBag = DisposeBag()
let refreshRelay = PublishSubject<Void>()
let refresh = refreshRelay
.asObservable()
.share()
let ballad = MusicSheetInfo()
ballad.type = 23
ballad.title = "情歌对唱榜"
ballad.imgUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554616722369&di=cdfdf3fc4c951c44e40b9d63cad0a2a9&imgtype=0&src=http%3A%2F%2Fi1.hdslb.com%2Fbfs%2Farchive%2F82fe4556b587af3350ff80d56bf803eac661d75f.jpg"
var bannerLoaded: Observable<[MusicSheetInfo]>
let a2 = Observable.just([ballad])
let a3 = a2.materialize()
let bannerReq = refresh
.flatMap {
a3
}.share()
// bannerLoaded = bannerReq.elements()
bannerLoaded = bannerReq.filter { $0.event.element != nil }
.map { $0.event.element! }
bannerLoaded.subscribe(onNext: { (resps) in
print("11",resps)
}).disposed(by: disposeBag)
// bannerLoaded
// .subscribeNext(weak: self) { (self) in
// return { (resps) in
// print("22",resps)
// }
// }.disposed(by: disposeBag)
refreshRelay.onNext(Void())
Printing description of a2: <Just<Array<MusicSheetInfo>>: 0x6000019112c0>
Printing description of a3: <Materialize<Array<MusicSheetInfo>>: 0x60000192c560>
Printing description of bannerReq: <ShareWhileConnected<Event<Array<MusicSheetInfo>>>: 0x600001709080>
Printing description of bannerLoaded: <Map<Event<Array<MusicSheetInfo>>, Array<MusicSheetInfo>>: 0x600001709350>
Printing description of resps:
▿ 1 element
▿ 0 : <studyRxswift.MusicSheetInfo: 0x600001704030>
// let bannerLoaded = bannerReq // .filter { $0.event.element != nil } // .map { $0.event.element! } // bannerLoaded.subscribe(onNext: { (resps) in // print("11",resps) // }).disposed(by: disposeBag) bannerReq.subscribe(onNext: { (event) in print("11",event.event.element!) }).disposed(by: disposeBag)
4.Moya MultiTarget
extension ZY where Base: MoyaProvider<MultiTarget> { @discardableResult open func request(_ target: TargetType, completion: @escaping Moya.Completion) -> Cancellable { return base.request(MultiTarget(target), queue: nil, completion: completion) } @discardableResult //Post是实现TargetType协议的枚举 func post(_ target: Post, completion: @escaping Moya.Completion) -> Cancellable { return base.request(MultiTarget(target), queue: nil, completion: completion) } @discardableResult //Get是实现TargetType协议的枚举 func get(_ target: Get, completion: @escaping Moya.Completion) -> Cancellable { return base.request(MultiTarget(target), queue: nil, completion: completion) } } //TODO:waiting for swift 4 https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances- extension MoyaProvider: ZYCompatible /*where Target: MultiTarget*/{} let publicParamEndpointClosure = { (target: MultiTarget) -> Endpoint<MultiTarget> in let url = target.path.isEmpty ? target.baseURL.absoluteString : target.baseURL.appendingPathComponent(target.path).absoluteString let endpoint = Endpoint<MultiTarget>(url: url, sampleResponseClosure: { .networkResponse(200, target.sampleData) }, method: target.method, parameters: target.parameters, parameterEncoding: target.parameterEncoding) return endpoint.adding(newHTTPHeaderFields: ["Content-Type" : "application/json"]) } let zyApi:ZY<MoyaProvider<MultiTarget>> = { () -> MoyaProvider<MultiTarget> in let manager = Manager(configuration: URLSessionConfiguration.default,serverTrustPolicyManager:CustomServerTrustPoliceManager()) let provider = MoyaProvider(endpointClosure: publicParamEndpointClosure, manager:manager,plugins:[NetworkLoggerPlugin(verbose: true)]) return provider }().zy class CustomServerTrustPoliceManager : ServerTrustPolicyManager { override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? { return .disableEvaluation } public init() { super.init(policies: [:]) } }
https://www.jianshu.com/p/574201cfd61c