Rxswift start

RxSwift 시작하기

Let’Swift는 Swift 개발자들이 만나고, 배우고, 즐기는 컨퍼런스로 총 13개의 세션으로 이뤄졌습니다. Swift 개발자들이 모여 iOS의 넥스트 스텝을 이야기한 행사였습니다. 빠르게 발전하는 언어 Swift에 대한 뜨거운 열의를 엿볼 수 있었던 Let’Swift 행사 동영상을 공유합니다

RxSwift는 최근 뜨거운 관심을 받고 있는 Rx(Reactive Extensions)를 Swift에 적용한 라이브러리입니다. 여가와 여행 문화를 혁신하는 스타트업인 frientrip의 개발자, 최완복님이 Let’Swift에서 RxSwift의 기초 개념을 설명하고 프로젝트에 적용하는 방법을 공유했습니다.


RxSwift

  • Rx: Reactive Extensions의 줄임말
  • Functional Reactive Programming을 이해하기 위해서는 아래 세 가지 개념을 이해해야 함
    • Functional programming
    • Data flows
    • Propagation of change
  • Functional programming: 1에서 10까지 더하는 문제의 절차적 방법과 함수형 방법 비교

이런 개발 뉴스를 더 만나보세요


// Procedural way 
var sum = 0
for i in 1...10 {
    sum += 1
}
print(sum)
// Functional way
print((1...10).reduce(0) { $0 + $1 })

  • Data flows: 데이터를 함수에 흘려보낼 수 있음

(1...10)
    .filter {
        $0 % 2 == 0 // 2, 4, 6, 8, 10
    }
    .map {
        $0 * 10 // 20, 40, 60, 80, 100
    }
    .reduce(0) {
        $0 + $1 // 300
    }

  • Propagation of Change: 처음 들어간 값의 변화가 전파됨

ReactiveX

  • ReactiveX는 Functional Reactive Programming의 구현체
  • observable 스트림을 사용하는 비동기 프로그래밍 API
  • observable: 비동기적으로 다수의 이벤트를 다루는 방법, Observer 패턴의 확장
  • 이벤트가 발생하면 이를 조작해서 구독할 수 있는 형태

  • observable 스트림

try RxSwift

  • Cocoa Pod로 제공하는 RxSwift 플레이그라운드
  • pod try RxSwift로 설치
  • dispose(): 입력 시 스트림이 중단됨
  • addDisposableTo(disposeBag): Disposable를 만들어서 편하게 사용할 수 있음

Login Validator 구현하기

  • 이메일 형식 체크, 패스워드 6자리 이상 체크, 이메일/패스워드가 비었을 때 입력 요구 등 3가지 기능 구현
  • 이메일 형식 체크
emailTextField.rx_text.asObservable()
    .map { $0.isEmail || $0.isEmpty } .addDisposableTo(disposeBag)    
    .subscribeNext {
        self.emailTextField.backgroundColor =
            $0 ? UIColor.whiteColor() : UIColor.alertColor
    }
    .addDisposableTo(disposeBag)

  • 패스워드 6자리 이상 체크
passwordTextField.rx_text.asObservable()
    .map { !(1..<6 ~= $0.characters.count) }
    .subscribeNext {
        self.passwordTextField.backgroundColor =
            $0 ? UIColor.whiteColor() : UIColor.alertColor
    }
    .addDisposableTo(disposeBag)

  • 이메일/패스워드가 비었을 때 입력 요구
let emailEmptyObservable = emailTextField.rx_text.asObservable()
.map { $0.isEmpty }
let passwordEmptyObservable = passwordTextField.rx_text.asObservable()
.map { $0.isEmpty }
Observable
    .combineLatest(emailEmptyObservable, passwordEmptyObservable) {
        return ($0, $1)
    }
    .subscribeNext { tuple in
        let buttonTitle: String = {
            switch tuple {
            case (true, true): return "이메일/패스워드를 입력하세요"
            case (true, _): return "이메일을 입력하세요"
            case (_, true): return "패스워드를 입력하세요"
            default: return "로그인 하기" }
        }()
        self.registerButton?.setTitle(buttonTitle, forState: .Normal)
        self.registerButton?.backgroundColor =
            tuple.0 || tuple.1 ? UIColor.gray4AColor : UIColor.tintColor
    }
    .addDisposableTo(disposeBag)

Alamofire.Request 래핑하기

  • 네트워크의 응답을 Rx로 래핑함
.response(queue: queue, responseSerializer: responseSerializer) { _response in
    switch _response.result {
    case .Success(let result):
        if let _ = _response.response {
            observer.on(.Next(result))
        } else {
            observer.on(.Error(NSError(domain: "Frip", code: -1, userInfo: nil)))
        }
        observer.on(.Completed)
    case .Failure(let error):
        observer.on(.Error(error as ErrorType))
    }
}

추천 및 참고 사이트


발표 슬라이드는 아래를 참고해주세요.

컨텐츠에 대하여

Let’Swift 컨퍼런스는 2016년 9월에 있었던 iOS 컨퍼런스로 주로 Swift에 대해서 다루었습니다. 발표자 분들의 동의를 얻어 Realm이 녹화하고 자료를 정리하여 공유합니다.

최완복

4 design patterns for a RESTless mobile integration »

close