본문 바로가기

전체 글

(205)
[MVVM] associatedtype으로 ViewModel 구조 추상화 associatedtype - Generic과 유사한 형태로, Protocol에서 사용될 타입에 대한 네임 스페이스, placeholer이다. - 실제로 Protocol을 채택해서 사용하기 전까지는 사용되는 타입이 무엇인지 명시가 되지 않는다. MVVM에서 Input/Output 패턴을 사용하면, 우리는 ViewModel마다 Input, Output구조체를 만들어줘야 한다. 이것이 과연 최선의 방법일까? 이것을 우리는 프로토콜을 이용해서 해결할 수 있다. 프로젝트를 구성하다 보면, 공통적으로 생기는 요소들, 반복되는 속성/메서드를 프로토콜의 형태로 사용할 수 있다. 만약, 프로퍼티의 타입이 동일하다면 그냥 작성하면 되지만, 각 화면의 뷰모델마다 서로 다른 Input, Output을 갖게 된다. 그러므로 ..
[MVVM] 인앤아웃버거? 인풋/아웃풋패턴! 인앤아웃 버거가 그렇게 짜다는데 .. 먹어봤어야 알지 .. 미국을 가봤어야 알지 !!! MVC패턴에서 UI부분과 비즈니스 로직을 분리해서 MVVM 패턴으로 개선할 수 있다. 그리고 이 MVVM 패턴에서 좀 더 데이터의 흐름을 분리하면, (UI 로직과 비즈니스 로직을 좀 더 분리하면 = 뷰에서는 로직에 대한 것을 모두 가리는 것, 없애는 것) Input/Output 패턴으로 개선할 수 있다. 개념은 간단(?)하다. Input 뷰로부터 전달된 데이터를 뷰모델에서 받게 되는 입력 데이터 VC -> VM Output 입력받은 데이터를 수정/변경해서 뷰에 표현하기 위한 출력 데이터 VM -> VC 간단한 예시로 말하자면 아래와 같다. ex) Input : 버튼의 탭, 텍스트 필드에 입력하는 텍스트 ex) Outp..
[🌱SeSAC] Rx복습, RxAlamofire/RxDataSource Rx .. 무시무시 어마무시 .. !! MVVM Pattern MVVM 패턴의 가장 큰 핵심은 양방향 데이터 바인딩이다. 양뱡향 데이터 바인딩을 위해서 아래와 같은 Observable 클래스를 만들었다. import Foundation class CObservable { private var listener: ((T) -> Void)? var value: T { didSet { listener?(value) } } init(_ value: T) { self.value = value } func bind(_ closure: @escaping (T) -> Void) { closure(value) listener = closure } } Q : 왜 이런 클래스를 만들었을까? A : 위에서 말했지만, 단방향 데..
[알고리즘] BFS? DFS? BFS 너비 우선 순회 Queue로 구현 (큐를 이용하기 때문에 FIFO) 장점) 최적해를 찾을 것을 보장한다. 예를 들어서 지구 상에 존재하는 모든 친구 관계를 그래프로 표현 후, 소깡이와 후리 사이의 관계 경로를 찾는 경우, BFS - 소깡이와 가까운 관계부터 살핀다. DFS - 일단, 지구상의 모든 관계를 살핀다. 어떤 로직으로 구현되는가? - 시작 노드를 큐에 삽입하고 방문처리를 한다. - 큐에서 노드를 꺼낸 후, 해당 노드의 인접 노드 중 방문하지 않은 노드를 모두 큐에 넣는다. 그리고 방문 처리를 한다. (방문하면 현재 위치를 pop하고 방문 처리 -> 방문'할' 곳은 큐에 넣는다.) 사용 예시 너비 우선 탐색 알고리즘은 많은 문제를 푸는 데 사용된다. 예를 들어, 소스 노드(처음 노드)와 다..
[🔥Rx뿌셔] Relay Relay란? 우선, Relay는 RxCocoa에 속해 있는 클래스이다. RxSwift가 아니라, RxCocoa에 속하는 개념으로 그 종류는 크게 세가지가 있다. Relay는 크게 세 가지 클래스가 있다. Publisch Relay Behavior Relay Replay Relay 각 PublishRelay와 BehaviorRelay는 이름에서 알 수 있듯이 PublishSubject랑 BehaviorSubject의 wrapper 클래스이다. 🤔 Relay와 Subject의 차이는 무엇일까? 이벤트를 방출하는 스타일의 차이이다. ✔️ Subject는 Observale와 같이 onNext, onError, onCompleted 이렇게 세 가지의 이벤트를 방출 시킬 수 있다. ✔️ Relay는 onNext ..
[🔥Rx뿌셔] Subject - Replay Subject Replay Subject Buffer Size만큼의 최신 값을 저장했다가 emit하는 Subject Relplay Subject는 이전에 방출됐던 요소들을 버퍼에 저장해 두었다가 새로운 구독자가 구독되었을 때 같이 넘겨주는 방식의 Subject 이미지로 나타내면 아래와 같다. 이전에 설명했던, Behavior Subject와 비슷하다. ✔️ 다른 점이 있다면 Behavior Subject와 다르게 제일 처음 구독자를 위한 초기값을 설정할 필요가 없고, ✔️ 가장 최근에 방출된 요소들의 (=전달받을 요소들의) 최대 개수를 지정할 수 있다. 코드로 구현하면 아래와 같다. let replay = ReplaySubject.create(bufferSize: 3) Replay Subject는 다른 Subject와..
[🔥Rx뿌셔] Subject - BehaviorSubject Behavior Subject BehaviorSubject는 PublishSubject와는 다르게 초기값을 가지고 시작한다. 다만, 그 초기값이 매번 일정한 것이 아닌 가장 마지막에 방출되었던 값이 초기값으로 지정된다. 이를 그림으로 확인하면 아래와 같다. -> Observable을 제일 처음 구독하는 구독자는 설정해준 초기 값으로 시작을 하게 되고, 그 다음구독자 부터는 구독하기 직전에 방출되었던 값으로 시작을 하게 된다. 코드로 구현하면 아래와 같다. let behaviorSubject = BehaviorSubject(value: "난 초기값이 있지롱") BahaviorSubject는 항상 초기값을 가지고 시작하기 때문에 초기화하는 방식도 PublishSubject와 조금 다르다. 이런식으로 초기화 ..
[🔥Rx뿌셔] Subject - Publish Subject Subject Subject는 Observable이자, Observer인 존재이다. 값을 수동으로 추가할 수 있으며 해당 값을 이미 구독 중인 subscriber에 emit할 수 있다. 예시 코드를 보자. ⬇️ // 1 let subject = PublishSubject() // 2 subject.onNext("듣고 있니 .. ?") // 3 let subscriptionOne = subject .subscribe(onNext: { (string) in print(string) }) // 4 subject.on(.next("얌마.")) // print: 얌마. // 5 subject.onNext("듣고 있냐고.") // print: 듣고 있냐고. 위의 코드에서 주석으로 표시한 숫자의 흐름은 아래와 동일하..