[RxSwift] - Cocoa와 RxCocoa

sun02·2022년 2월 18일
0

RxSwift

목록 보기
8/12

Cocoa란?

Cocoa는 OS X와 iPhone, iPad, iPod-Touch 등 Multi-Touch Device들의 운영체제인 iOS 를 위한 응용 프로그램 환경입니다.

(여기서 OS X는 맥 운영체제의 열번째 운영체제로 현재(2022)기준으로는 MacOS 라고 보면 되겠습니다.)

Cocoa는

  • 객체지향 소프트웨어 라이브러리
  • 런타임 시스템
  • 통합 개발 환경

으로 구성되어 있습니다.

Cocoa는 OS X와 iOS에서 실행되는 응용프로그램(application)에 런타임 시스템을 제공하는 객체지향 프레임워크 세트입니다.
OS X에는 가장 탁월한 체제이며, iOS에는 유일한 응용프로그램 환경입니다.
Mail, Safari 등 애플생태계에서 볼 수 있는 대부분의 응용프로그램은 Cocoa 응용 프로그램입니다.

통합개발환경 Xcode는 OS X와 iOS 두 플랫폼에 대한 개발을 지원합니다.
Xcode와 Cocoa의 조합으로 응용프로그램을 쉽게 만들 수 있습니다.

Cocoa의 두 가지 측면

Cocoa는 런타임 측면과 개발 측면을 제공합니다.

1) 런타임 측면

Cocoa 응용프로그램은 User Interface를 제공하며 운영체제의 다른 가시적(visible) 구성요소들과 밀접하게(tightly) 통합됩니다.

2) 개발 측면

Cocoa는 OS X와 iOS의 application을 강력하고 빠르게 만들 수 있게끔하는 객체지향 소프트웨어 구성요소(class)의 통합 제품군입니다.

class는 재사용 및 적용(adaptable)이 가능한 소프트웨어 빌딩 블럭입니다. 사용자의 용도에 맞게 확장하거나 그대로 사용할 수 있습니다.

Cocoa class는 User Interface에서 data formatting까지 우리가 생각할 수 있는 거의 모든 개발 부분에서 존재합니다.

- How Cocoa Fits into iOS

  • Core OS : kernel, 파일 시스템, 네트워킹 인프라, 보안, 전원관리, 여러 장치 드라이버 등으로 포함된 계층입니다.
  • Core Service : 이 계층의 framework는 문자열 조작(String manipulation), 컬렉션 관리(collection management), 네트워킹, URL 유틸리티, 연락처 관리(contact management)및 기본 설정과 같은 핵심서비스를 제공합니다. 또한 GPS, 나침반, 가속도계와 같은 기기의 하드웨어적 측면의 기능도 제공합니다.
    • Core Serivce 계층의 framework : Core Location, Core Motion, System Configuration, Foundation, Core Foundation 등
    • 또한 Core Foundation은 Core data 프레임워크를 포함하고 있습니다.
  • Media : 이 계층의 프레임워크와 서비스는 Core Service 계층에 의존하고 Cocoa Touch 계층에 그래픽 및 멀티미디어 서비스를 제공합니다.
    • Media 계층의 framework : Core Graphics, Core Text, OpenGL ES, Core Animation, AVFoundation, Core Audio 등
  • Cocoa Touch: iOS 기반의 응용프로그램을 직접 지원합니다.
    • Cocoa Touch 계층의 framework : MapKit, GameKit 등

iOS의 핵심 framework

  • UIKit : 애플리케이션이 User Interface에 표시하는 object를 제공합니다.
  • Foundation: object의 기본 동작을 정의하고 관리 매커니즘을 설정하며 기본 데이터 타입, collection, 운영체제 서비스에 대한 object를 제공합니다.

출처 - Apple develpoer document_Cocoa

RxCocoa란?

iOS 개발을 위한 필수 framework인 cocoa framework를 rx스럽게 사용할 수 있도록 rx로 감싼 것입니다.

기존 cocoa framework에 Reactive 라이브러리의 장점을 입혀서 사용할 수 있게 한 것으로 RxSwift와 RxReplay에 의존합니다.

Rxcocoa에서 사용하는 개념으로는

  • Binder
  • Traits
  • Rx extension

등이 있습니다.

1. Binder<Value'>

: 단방향 데이터 스트림

값을 생성하는 생성자(observable)와 그 값을 받는 수신자(binder)가 있을 때

생성자 -> 수신자 (0)
생성자 <- 수신자 (x)

=> 생성자는 값을 전달할 수 있지만, 수신자는 값을 전달할 수 없습니다.

- Binder의 특징

  • Observer(수신만 가능)
  • UI binding에 사용
  • Error 이벤트 받지 않음
    • Error이벤트를 받으면 observable sequence 자체 종료되는데 binder는 UI binding에 사용되기 때문에 에러를 받으면 UI가 제대로 작동하지 않는 것처럼 보일 수 있기 때문입니다.
  • Main thread에서 실행되는 것을 보장
    • Binding이 성공하면 UI가 update되어야하는데 이는 메인스레드에서만 이루어져야하기 때문입니다.

2. Traits

Driver<Element'>
Signal<Elemnet'>

- 대표 Traits(driver, signal)의 특징

  • Error 방출하지 않는 observable
    • onNext만 방출함 : Driver -> drive(), Signal -> emit()
  • Main Thread에서 실행
  • 스트림 공유가 가능함
    • binder에서는 observer가 증가할 때마다 스트림도 함께 증가해서 리소스 낭비가 발생할 수 있지만 signal을 사용하면 observer가 증가할 때 스트림을 새로 만들지 않고 공유하기 때문에 리소스 낭비를 줄일 수 있습니다.
  • Driver : 구독하는 순간 초기, 최신값을 제공
  • Signer : 구독한 이후에 발생한 값만 제공

3. Rx extension

특정 속성을 rx스럽게 사용하고자 할 때, 원하는 속성이 없는 경우 사용합니다.

extension Reactive where Base: T {

}

예를 들어 sizeToFit을 rx에서 사용하고 싶다면

extension Reactive where Base: UIView {
	var sizeToFit: Binder<Void> {
    	return Binder(base) { base, _ in
        	base.sizeToFit()
        }
    }
}

다음과 같이 extension을 작성하여

button.rx.sizeToFit()

이렇게 사용할 수 있습니다.

0개의 댓글