Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

combineの簡単な例

PassthroughSubject と CurrentValueSubject

を使ってみた。おおよそRxSwift的に使えると思った。

func test() -> Void {
    let pub = PassthroughSubject<Int, Error>()
    _ = pub
        .sink(receiveCompletion: { _ in
            
        }) {
            value in
            print("new val -> \(value)")
    }
    
    pub.send(10)
    pub.send(100)
    pub.send(completion: .finished)
    
}

//test()

func test2() -> Void {
    let pub = CurrentValueSubject<Int, Error>(100)
    _ = pub.sink(receiveCompletion: {_ in
    }, receiveValue: { (value) in
        print("new val -> \(value)")
    })
    
    pub.send(100)
    pub.send(1000)
    pub.send(completion: .finished)
    
}
//test2()

func test3() -> Void {
    let pub = [1,2,3,4,5,6,7,8,9,10].publisher
    _ = pub.sink(receiveValue: { value in
        print("new val -> \(value)")
    })
}
//test3()


func test4() -> Void {
    let pub = [1,2,3,4,5].publisher
    let pub2 = pub.map { (x) -> Int in
        return x*2
    }
    
    _ = pub2.sink(receiveValue: { value in
        print("new val -> \(value)")
    })
}
//test4()


/*
 new val -> (4, 5)
 new val -> (4, 6)
 new val -> (4, 7)
 new val -> (4, 8)
 */
func test5() -> Void {
    let pub = [1,2,3,4].publisher
    let pub2 = [5,6,7,8].publisher
    let pub3 = pub.combineLatest(pub2)
    _ = pub3.sink(receiveValue: { value in
        print("new val -> \(value)")
    })
}

//test5()

/*
 new val -> (1, 5)
 new val -> (2, 6)
 new val -> (3, 7)
 new val -> (4, 8)
 */
func test6() -> Void {
    let pub = [1,2,3,4].publisher
    let pub2 = [5,6,7,8].publisher
    let pub3 = pub.zip(pub2)
    _ = pub3.sink(receiveValue: { value in
        print("new val -> \(value)")
    })
}

//test6()

func test7() -> Void {
    let sub = PassthroughSubject<Int, Error>()
    _ = sub.sink(receiveCompletion: { comp in
        print("\(comp)")
    }, receiveValue: { (value) in
        print("new val -> \(value)")
    })
    
    sub.send(100)
    sub.send(120)
    sub.send(completion: .failure(NSError(domain: "Error!", code: 0, userInfo: nil)))
}

test7()