훌이
후리스콜링개발
훌이

블로그 메뉴

  • 왈 (iOS APP)
  • Github
전체 방문자
오늘
어제
  • 전체 (171)
    • ⭐️ 개발 (140)
      • JAVA (4)
      • Web (5)
      • iOS & Swift (94)
      • iOS Concurrency (4)
      • Rx (18)
      • Git (6)
      • WWDC (1)
      • Code Refactor (3)
      • Server (1)
    • ⭐️ Computer Science (22)
      • 운영체제 (10)
      • 네트워크 (5)
      • PS (7)
    • 경제시사상식 (8)
    • 기타 등등 (0)

인기 글

최근 글

05-18 08:38

티스토리

hELLO · Designed By 정상우.
훌이

후리스콜링개발

⭐️ 개발/Rx

[Rx] Create Operators

2023. 3. 17. 20:26
728x90
반응형

Create Operators

just, of, from

range, generate

repeateElement

deferred

create

 

 

just, of, from

 

import RxSwift

let disposeBag = DisposeBag()
let element = "🎀"

// MARK: - just, of, from 옵저버블 생성에 사용한느 가장 단순하고 기초적인 세가지 연산자

// just는 파라미터로 전달한 걸 그대로 전달한다.
// 🎀
Observable.just("🎀")
    .subscribe { event in print(event) }
    .disposed(by: disposeBag)




// [1, 2, 3]
Observable.just([1, 2, 3])
    .subscribe { event in print(event) }
    .disposed(by: disposeBag)




// of는 두 개 이상을 전달할 때 가능, just로는 불가능
// 문자열 2개가 각각 전달이 된다.
//next(a)
//next(b)
Observable.of("a", "b")
    .subscribe { event in print(event) }
    .disposed(by: disposeBag)





//next([1, 2])
//next([3, 4])
Observable.of([1,2], [3,4])
    .subscribe { event in print(event) }
    .disposed(by: disposeBag)





// 배열에 저장된 요소를 하나씩 방출하고 싶다면 from을 사용한다.
//next(1)
//next(2)
//next(3)
//next(4)
Observable.from([1,2,3,4])
    .subscribe { event in print(event) }
    .disposed(by: disposeBag)

 

range, generate

// MARK: - range, generate정수를 지정된 수만큼 방출하는 옵저버블

// 1씩 증가하는 연산자임
//next(1)
//next(2)
//next(3)
//next(4)
//next(5)
Observable.range(start: 1, count: 5) // start에 정수를 넣어야 함
    .subscribe { print($0) }
    .disposed(by: disposeBag)





// 시작값(가장 먼저 방출되는 값)
// true를 리턴해야 요소 방출, false를 방출 시 completed
// iterate 요소는 값을 변경하는 것

// generate는 파라미터가 정수로 제한되지 않는다.
//next(10)
//next(8)
//next(6)
//next(4)
//next(2)
Observable.generate(initialState: 10, condition: { $0 > 0 }, iterate: { $0-2 })
    .subscribe { print($0) }
    .disposed(by: disposeBag)






//next(📕)
//next(📕📘)
//next(📕📘📕)
//next(📕📘📕📘)
//next(📕📘📕📘📕)
//next(📕📘📕📘📕📘)
Observable
    .generate(initialState: "📕",
              condition: { $0.count<7 },
              iterate: { $0.count.isMultiple(of: 2) ? $0 + "📕" : $0 + "📘" })
    .subscribe { print($0) }
    .disposed(by: disposeBag)

 

repeateElement

// MARK: - RepeatElement 동일한 요소를 반복적으로 방출하는 옵저버블

// 해당 요소를 반복적으로 반환 - 무한정 반복해줌
// 그래서 방출되는 요소를 제한해줘야 함 - take 연산자로
Observable.repeatElement("루")
    .take(7)
    .subscribe { print($0) }
    .disposed(by: disposeBag)

//next(루)
//next(루)
//next(루)
//next(루)
//next(루)
//next(루)
//next(루)

 

deferred

// MARK: - deferred 특정 조건에 따라 옵저버블을 생성하는 방법

var flag = true

let factory = Observable.deferred {
    flag.toggle()
    
    if flag {
        return Observable.from(["루희", "사랑", "하트", "해피"])
    } else {
        return Observable.from(["힘듦", "그지", "아픔", "우울"])
    }
}

factory
    .subscribe { print($0) }
    .disposed(by: disposeBag)
// 초반에 true를 toggle로 뒤집었기 때문에 false값으로 바껴서 from 연산자의 요소가 방출됨
//next(힘듦)
//next(그지)
//next(아픔)
//next(우울)



factory
    .subscribe { print($0) }
    .disposed(by: disposeBag)
// 다시 factory 옵저버블을 구독해서 false -> true로 바껴서 true값의 요소가 방출
//next(루희)
//next(사랑)
//next(하트)
//next(해피)

 

create

// MARK: - create 옵저버블을 직접 구현

// 앞 연산자들까지는 파라미터로 전달된 요소를 방출하는 옵저버블을 생성한다.
// 모든 요소를 방출하고 끝낸다. 그리고 동작을 바꿀 수 없다.
// 직접 구현하고 싶다면, create를 써야 한다.

enum MyError: Error {
    case error
}

// 요소를 방출할 때는 onNext를 사용하고, 파라미터로 방출할 요소를 전달하자.
// 옵저버블을 종료하기 위해서는 onError, onCompleted를 반드시 호출해야 한다.
// onNext를 호출하려면 두 메소드가 호출되기 전에 호출해야 한다.

//옵저버를 파라미터로 받아서 Disposable을 반환한다.
//잘못된 URL을 사용하면 오류가 발생한 거니까 error event를 반환해야 함
//observer에서 onError를 방출하자! + Disposable 반환

//문자열을 저장할 수 없다면 에러이벤트 전달

//문자열을 잘 저장했다면 문자열을 방출하자! onNext로!

//error가 발생하면 error event 방출

Observable<String>.create { (observer) -> Disposable in
    guard let url = URL(string: "https://www.apple.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)
// MARK: - empty, error 요소를 방출하지 않는 특별한 연산자

// next event를 방출하지 않는다!

// empty 연산자는 파라미터가 없다
// 옵저버가 아무런 동작없이 종료해야 할 때 쓴다
// completed
Observable<Void>.empty()
    .subscribe { print($0) }
    .disposed(by: disposeBag)


// error - 에러를 처리할 때 활용
// error(error)
enum MyError: Error {
    case error
}
Observable<Void>.error(MyError.error)
    .subscribe { print($0) }
    .disposed(by: disposeBag)
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'⭐️ 개발 > Rx' 카테고리의 다른 글

[Rx] Conditional Operator  (0) 2023.03.19
[Rx] Filtering Operator  (0) 2023.03.18
[Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest  (0) 2023.01.19
[Rx] NSObject+Rx 라이브러리  (1) 2023.01.18
[Rx Operator 시리즈] 3. Zip  (0) 2023.01.16
    '⭐️ 개발/Rx' 카테고리의 다른 글
    • [Rx] Conditional Operator
    • [Rx] Filtering Operator
    • [Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest
    • [Rx] NSObject+Rx 라이브러리
    훌이
    훌이

    티스토리툴바