본문 바로가기

전체 글

(30)
[UIKit] Dynamic cell sizing - systemLayoutSizeFitting TableView/CollectionView를 포함하여 일반적인 View 사용 시, 텍스트 등의 내부 컨텐츠를 바탕으로 사이즈 구성이 필요한 경우가 있습니다. 이런 경우에는 Layout Constrains를 기반으로 뷰의 사이즈를 계산하는 systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority:) 을 통해 동적으로 사이즈를 계산할 수 있습니다. 대표적으로 위와 같은 화면에서 컨텐츠(텍스트)에 따른 너비 설정이 필요합니다. 위와 비슷한 화면을 구성하면서 사용 방법을 알아보겠습니다. 위 코드는 CollectionViewCell contentView에 label을 추가하고, constraint를 설정하는 코드입니다. 텍스트..
[UIKit] CollectionView - cell reuse시 주의해야 할 점 collectionView 사용 시, cell을 구성하기 위해 dataSource function 중 하나인 cellForItemAt을 사용합니다. 그리고 일반적으로 이 function 안에서, 많은 양의 셀의 생성/소멸을 막아 메모리의 부담을 줄이기 위해 셀을 재사용하는 과정을 거칩니다. 이는 구성한 각 셀들이 CollectionView를 reload 할 경우, 실질적으로 다른 셀들이 될 수 있음을 의미합니다. cellForItemAt을 통해 Cell을 구성한다면 보기에는 reload 이전과 같은 Cell로 보이지만, reload 과정에서 이전과 같은 셀을 재사용한다는 보장이 되어 있지 않기 때문입니다. 위 영상은 Timer를 통해 일정 주기로 CollectionView를 reload하며, 각 셀들의 ..
[RxSwift] 토이 프로젝트를 통해 알아보는 RxSwift x MVVM 위와 같은 토이 프로젝트를 만들어 보면서, RxSwift 활용과 MVVM을 적용하는 방법에 대해서 다루고자 합니다. 이 토이 프로젝트는 실제 네트워크 통신을 하지 않았습니다, 대신 request시 global Queue에서 작업을 진행하고 완료되면 main Queue로 변환하여 결과 데이터를 넘겨주도록 진행함으로써 네트워크 통신과 유사한 환경을 만들고자 했습니다. DataModel의 경우 name, age, value 값을 가지고 있으며, 테스트를 위해 다음과 같이 데이터를 설정했습니다. name은 구분하기 쉽게 필터값 age는 20~49의 랜덤 값 value는 아이템 순서 값 요구 사항 (위 시연 영상 참고) 리스트 형식이며, 최신순, 오래된 순, 인기순으로 정렬할 수 있다. (필터) 리스트는 한 페이..
[RxSwift] Subject에 대한 개념 Subject는 RxSwift를 사용하여 프로젝트를 진행할 경우 많이 접하게 될 항목들입니다. 여기에서는 Subject 자체에 대한 설명만 하려 합니다. Subject는 PublishSubject, BehaviorSubject, ReplaySubject세 가지 종류가 있으며, 이에 대한 차이점은 ReactiveX 공식 사이트를 참고하시면 좋을 것 같습니다. ReactiveX - Subject If you have a Subject and you want to pass it along to some other agent without exposing its Subscriber interface, you can mask it by calling its asObservable method, which will..
[RxSwift] Single Trait - wrapping network request Single Trait RxSwift에서는 Single Trait 을 지원합니다. Single은 Observable의 한 형태이며, 한 가지 값 또는 에러를 발행합니다. 따라서 구독 시, success와 error 두 가지의 이벤트에 처리를 할 수 있습니다. 대표적인 예로는 네트워크 요청 구독을 위해 request를 Single로 wrapping 하여 사용할 수 있습니다. 위의 예제는 기존 프로젝트에서 Alamofire를 사용하여 Request 하는 로직을 Single로 Wrapping 한 코드입니다. 네트워크 요청은 한 번의 API 콜을 통해 성공/실패 두 개의 이벤트만을 필요로 하기 때문에 Single을 사용하는 좋은 예제입니다. Single을 사용하면 명시적으로 하나의 성공 혹은 실패 여부만을 관리..
[RxSwift] 기초(Observable, Subscribe, Disposable, DisposeBag) Observable Observable - 관찰 가능한, 관찰할 수 있는 단어의 뜻이 직관적이라 이해하기 쉽다고 생각합니다. ReactiveX 공식 사이트에는 다음과 같이 나와 있습니다. ReacriveX에서 Observer는 Observable을 구독한다. Observable이 배출하는 하나 또는 연속된 항목에 Observer는 반응한다. 정리하면 다음과 같습니다. ReactiveX는 Observable이라는 객체를 통해 값을 배출할 수 있고, Observable에서 배출해주는 값을 관찰하고 이에 반응합니다. Observable에는 행동 규칙이 있습니다. 바로 next, error, complete 입니다. 각각 행동에 대해 알아보겠습니다. next Observable은 하나 또는 여러 개의 항목을 발..
[iOS] Mock 데이터 기반 TDD 적용하기 - OHHTTPStubs 현재 프로젝트는 API 프로토콜을 정의하고, 해당 구현체를 주입하는 방식으로 API를 사용하고 있습니다. 따라서 테스트를 위해 Mock API 구현체를 구현하고, 해당 객체를 주입하여 테스트를 할 수 있습니다. 하지만, 위와 같은 방식으로 하기에는 다소 까다로운 점들이 있습니다. 테스트하고자 하는 API 외에도 프로토콜 채택하기 위해 다른 API에 해당하는 function들도 구현해야 함 Mock Object 주입을 위한 코드 수정이 불가피함 다양한 방식으로 테스트의 어려움 (ex) 비동기 테스트, 같은 API 성공/실패 혹은 다양한 값) 위와 같은 까다로움을 OHHTTPStubs를 통해 해소할 수 있다고 판단했습니다. OHHTTPStubs는 좀 더 Low level인 URLSessionConfigura..
[RxSwift] Using Single with share [ Single ] RxSwift에서는 Single Trait 을 지원합니다. Single은 Observable의 한 형태이며, 한 가지 값 또는 에러를 발행합니다. 따라서 구독시, success와 error 두 가지의 이벤트에 처리를 할 수 있습니다. 대표적인 예로는 네트워크 요청 구독을 위해 request를 Single로 wrapping 하여 사용할 수 있습니다. [ Share ] 또한 RxSwift에서는 share 를 제공합니다. share는 생성된 Observable 시퀀스를 공유하기 위해 사용되는 개념입니다. 처음 Rx를 시작하는 경우, 자주 실수하는 부분이 있습니다. 바로 subscribe 할 때마다, 새로운 시퀀스가 생성되는 것을 모르는 경우가 많은 것입니다. 따라서 위의 경우, 실제로 같은..