Tunko Development Diary

RxSwift) Creating Operators (repeatElement, deferred, create) ๋ณธ๋ฌธ

Development/RxSwift

RxSwift) Creating Operators (repeatElement, deferred, create)

Tunko 2022. 5. 31. 16:02

repeatElement

let disposeBag = DisposeBag()
let element = "๐Ÿ‘"

Observable.repeatElement(element)
    .take(10)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

์ถœ๋ ฅ

next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
next(๐Ÿ‘)
completed

๋™์ผํ•œ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐฉ์ถœํ•˜๋Š” ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

๋ฌดํ•œ์ • ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฐฉ์ถœ๋˜๋Š” ํšŸ์ˆ˜๋ฅผ ์ •ํ•ด์ฃผ๋Š”๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. take ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ 10๊ฐœ์˜ ์š”์†Œ๋งŒ ๋ฐฉ์ถœ๋˜๋„๋ก ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

deferred

let disposeBag = DisposeBag()
var flag = true

let observable : Observable<Int> = Observable.deferred {
    flag.toggle()
    if flag {
        return Observable.just(1)
    } else {
        return Observable.just(2)
    }
}

observable
    .subscribe { print($0) }
    .disposed(by: disposeBag)

์ถœ๋ ฅ

next(2)
completed

ํŠน์ •์กฐ๊ฑด์— ๋”ฐ๋ผ ์˜ต์ €๋ฒ„๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž ์ž…๋‹ˆ๋‹ค. flag ์กฐ๊ฑด์— ๋”ฐ๋ผ 2๊ฐ€ ๋“ค์–ด๊ฐ„ just์˜ต์ €๋ฒ„๋ธ”์ด ๊ตฌ๋…๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

create

just, of, from, range, genarate, repeatElement, deferred ๋“ฑ์˜ ์—ฐ์‚ฐ์ž๋Š” ์˜ต์ €๋ฒ„๋ธ”์— ๋ฐ›์€ ์š”์†Œ๋ฅผ ๋ฐฉ์ถœํ•˜๊ณ  completed๋ฅผ ํ†ตํ•ด์„œ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค

์ด๋Ÿฐ ๋™์ž‘ ๋ฐฉ์‹์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„  create๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ์˜ต์ €๋ฒ„๋ธ”์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

create๋Š” Observer์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์„œ Disposable์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

return์— ์œ ์˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Disposable์„ ๋ฆฌํ„ดํ•˜๋ผ๊ณ  ๋˜์–ด์žˆ๋Š”๋ฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ผญ Disposables.create() ๋กœ ๋ฆฌํ„ดํ•ด์ค๋‹ˆ๋‹ค.

create์˜ต์ €๋ฒ„๋ธ”์„ ํ†ตํ•ด ์š”์†Œ๋ฅผ ๋ฐฉ์ถœํ• ๋•Œ๋Š” onNext๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

create์˜ต์ €๋ฒ„๋ธ”์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„  onError, onCompleted ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ผญ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

let disposeBag = DisposeBag()

enum MyError: Error {
   case error
}

Observable<String>.create { (observer) -> Disposable in
    observer.onNext("๋‚ด๊ฐ€ ํ•˜๊ณ ์‹ถ์€ ์ฒ˜๋ฆฌ")
    observer.onCompleted()
    return Disposables.create()
}
.subscribe{ print($0) }
.disposed(by: disposeBag)

์ถœ๋ ฅ

next(๋‚ด๊ฐ€ ํ•˜๊ณ ์‹ถ์€ ์ฒ˜๋ฆฌ)
completed

์›น์—์„œ html ๋ฌธ์ž์—ด์„ ๋ฐ›๋Š” ์˜ต์ €๋ฒ„๋ธ” ์ƒ์„ฑ

Observable.create { (observer) -> Disposable in
    guard let url = URL(string: "<https://huniroom.tistory.com/>") else {
        observer.onError(MyError.error)
        return Disposables.create()
    }
    
    guard let html = try? String(contentsOf: url, encoding: .utf8) else {
        observer.onError(MyError.error)
        return Disposables.create()
    }
    observer.onNext(html)
    observer.onCompleted()
    
    return Disposables.create()
}
.subscribe{ print($0) }
.disposed(by: disposeBag)

 

๋ฐ˜์‘ํ˜•
Comments