iOS Development(16)
-
[RxSwift] Rx와 MVVM의 찰떡궁합 케미
MVC 패턴과 MVVM 패턴을 비교해보고 RxSwift를 MVVM 패턴와 함께 구현하는 것이 왜 좋은지 알아 볼 수 있다. MVC Model, View, Controller로 구성됨 MVC 패턴에 대한 애플의 생각 예전 Apple “Cocoa Framework 아키텍쳐는 MVC 패턴을 기반으로 하고 있음 👌” → 그럼 MVC 패턴으로 개발해야겠군! 현재 Apple “MVC로 개발하는 것이 최선이 아닐 수 있음 🤦” → ? 그럼 무슨 패턴을 적용해야하지? 현실의 Cocoa MVC UIView와 UIViewController를 완전히 분리해서 개발하기란 어려움 필연적으로 비대한 UIViewController를 만들게 되고 비즈니스 로직과 View가 혼합되기 쉬움 MVVM Model, View, ViewMod..
2024.04.13 -
[RxSwift] RxSwift에서는 에러 처리를 어떻게 할까?
앱에서 가장 흔하게 발생할 수 있는 에러 상황은 인터넷 연결 없음(오프라인 상태), 잘못된 입력(잘못된 타입, 길이, 크기, 내용 등) API, HTTP 에러(400, 500, JSON Codable 등) 등이 있다. 그렇다면 RxSwift에서는 이런 에러 상황에서 어떻게 처리를 할까? RxSwift의 에러 관리 catch 에러를 잡아서 처리 클로저를 받아서 새로운 형태의 Observable를 반환함 func catch(_ handler:) → RxSwift.Observable enum MyError: Error { case anError case criticalError } Observable.create { $0.onError(MyError.anError) // 오류 발생 return Disposab..
2024.04.13 -
[RxSwift] Cocoa Framework 판에 RxCocoa의 등장이라
Cocoa Framework의 구성 Foundation: 기본적인 자료형과 메서드가 정의되어 있음 ApplicationKit(UIKit): 주로 UI 개발에 사용됨 RxCocoa Cocoa 프레임워크(UI 컴포넌트와 각각의 속성, 이벤트 등)를 Rx로 감싸서 처리할 수 있도록 도와줌 ex. UISearchBar로 입력한 문구를 이용해 네트워크 통신을 하고 그 결과를 UITableView에 뿌려주는 기능 서로 다른 클래스(UISearchBar, UITableView)에서 비동기적으로 발생한 값을 기존 애플 API가 제공하는 방식으로 조합하고 전달하려면 구현하기가 매우 까다로울 것 Rx를 이용하면 간단하고 명시적으로 작성 가능 let searchResults = searchBar.rx.text .distin..
2024.04.12 -
[RxSwift] 대표적인 Operator에 대해서 알아보기
Filtering Operator filter 클로저 내부에 true/false 값을 반환하는 조건문이 있어 조건문이 true인 경우에만 결과로 전달함 Transforming Operator map Observable 타입의 객체들이 내뿜는 값을 받아서 원하는 형태로 변형하여 결과로 전달함 Combining Operator 앞선 Operator들과 마찬가지로 시퀀스 출력 값을 핸들링하여 결과를 내뿜는다는 점에서 동일하지만 여러 가지 시퀀스들을 조합할 수 있다는 점에서 차이가 있음 merge A, B 모두 같은 타입이어야 함 Time Based Operator 시간의 흐름에 따라 시퀀스의 이벤트 방출이나 구독을 제어 buffer 지정한 시간과 개수만큼 이벤트를 묶어서 시퀀스로 반환함
2024.04.12 -
[RxSwift] RxSwift로 네트워크 통신 구현하기
RxSwift와 RxCocoa를 이용해서 네트워크 통신을 하는 fetch 함수를 구현하고 (GitHub API를 사용하여 organization 이름으로 GitHub에 업로드된 레포지토리 목록을 불러옴) UITableViewController의 UIRefreshControl에서 fetch 함수를 호출하여 당겨서 새로고침 기능을 구현할 수 있다. 1. Repository 타입의 데이터 모델 생성 2. BehaviorSubject와 DisposeBag 생성 private let repos = BehaviorSubject(value: []) private let disposeBag = DisposeBag() 3. fetch 함수 정의 String → URL → URLRequest → Observable → D..
2024.04.12 -
[RxSwift] Observable, Trait, Subject
Observable 생명주기 Observable은 어떤 구성 요소를 가지는 next 이벤트를 계속해서 방출할 수 있음 Observable은 이벤트가 완전히 종료되었음을 나타내는 이벤트를 방출할 수 있음 | : completed 이벤트 X : error 이벤트(Swift.Error 인스턴스를 갖고 있음) Trait 코드의 가독성을 높이기 위해 좁은 범위의 Observable 사용 → 즉 Observable의 제한된 버전이라고 생각하면 됨 Single success 또는 error 이벤트를 한 번만 방출 success = next + completed 파일의 저장이나 다운로드, 디스크에서 데이터 로딩 등과 같이 기본적으로 값을 산출하는 비동기적 연산에 사용 ex. 사진을 저장하는 Observable에서 사진..
2024.04.12