Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Observable 와 Observer #74

Closed
Youngminah opened this issue Nov 2, 2021 · 1 comment
Closed

Observable 와 Observer #74

Youngminah opened this issue Nov 2, 2021 · 1 comment
Labels

Comments

@Youngminah
Copy link
Owner

Youngminah commented Nov 2, 2021

Observable과 Observer

  • Observable : 관측(subscribe) 당하는 대상
  • Observer (=subscriber) : Observable을 구독하는 주체

Observable의 이벤트 생성

  • just : 오직 하나의 요소만을 포함하는 이벤트 생성
  • of : 주어진 값들을 타입추론하여 Observable sequence 생성. 한개 또는 여러개 가능. Array의 경우 하나의 값으로 인식
  • from : Array만 연산자로 취한다. Array의 값들을 하나하나 방출 하게 해줌
  • create : 클로저 형식으로 다양한 값 생성 가능
    • escaping에서는 AnyObserver를 취한 뒤 Disposable을 리턴
Observable<Int>.create { observer in
	observer.onNext(1)
    observer.dispose()
} 
Observable<String>.create({ (observer) -> Disposable in
     observer.onNext("1")
     observer.onCompleted()
     return Disposables.create()
 })
  • create 예제

Subscribe Method 3가지

Observer가 Observable에 연결하는 것(Observer입장에서 Observable의 emit을 발생하게끔 하는 것)

  • onNext : 최신 이벤트를 방출
  • onError : 에러 발생. 이벤트 발생 종료됨. (onNext, onCompleted 더이상 사용 불가)
  • onCompleted : 정상 종료

Observable의 Traits

  • Single : success, error (파일 쓰기, 파일 다운로드, 데이터 로딩)
  • Maybe : success, completed, error
  • Completable : .completed, error (일의 끝, 오류 판단)

success와 completed차이 : 파라미터 유무
.success(value)
.completed

let disposeBag = DisposeBag()
     
// 2
enum FileReadError: Error {
    case fileNotFound, unreadable, encodingFailed
}
     
// 3
func loadText(from name: String) -> Single<String> {
// 4
    return Single.create{ single in
             // 4 - 1
        let disposable = Disposables.create()
             
         // 4 - 2
         guard let path = Bundle.main.path(forResource: name, ofType: "txt") else {
             single(.error(FileReadError.fileNotFound))
             return disposable
         }
             
         // 4 - 3
         guard let data = FileManager.default.contents(atPath: path) else {
             single(.error(FileReadError.unreadable))
             return disposable
         }
             
         // 4 - 4
         guard let contents = String(data: data, encoding: .utf8) else {
             single(.error(FileReadError.encodingFailed))
             return disposable
         }
             
         // 4 - 5
         single(.success(contents))
         return disposable
     }
 }
  loadText(from: "Copyright")
         .subscribe{
             switch $0 {
             case .success(let string):
                 print(string)
             case .error(let error):
                 print(error)
             }
         }
         .disposed(by: disposeBag)
  • single 파일 읽기 예제
@Youngminah
Copy link
Owner Author

참고자료

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant