第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

(1)基本介绍
  • 该操作符可以将序列产生的事件,转换成元素。
  • 通常一个有限的 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

 

posted @ 2019-10-16 09:49  lianhuaren  阅读(306)  评论(0编辑  收藏  举报