UIImageView를 extension을 해서 UICollectionViewDelegate의 collectionView(_:cellForItemAt:)이 호출되는 시점에서 cell의 UIImageView에서 이미지를 비동기를 가져오는 작업을 수행(Cell이 이미지를 가져오는 작업을 수행)할 경우 다음과 같은 문제가 발생할 수 있습니다. 셀 재사용으로 인한 이미지 비동기 작업 중첩 View가 이미지 작업에 관한 책임을 가지게 되는 문제 셀 재사용으로 인한 이미지 비동기 작업 중첩 이미지를 가져오는 작업이 완료되기 전에 셀의 재사용으로 인해 이미지를 가져오는 비동기 작업을 계속해서 수행하게 될 경우 셀의 이미지가 중첩된 이미지를 가져오는 비동기 작업이 완료되는 순서대로 바뀌는 문제입니다. View가 이미지..
Alamofire는 URLSession을 쉽게 사용하게 해 주고 statusCode에 따른 응답 유효성 검사, 응답값 디코딩 등등 여러 가지 편의 기능들을 여럿 지원해 준다. 대표적인 기능으로는 요청을 보낼때마다 공통적인 부분 혹은 로직을 분리해서 재사용할 수 있게 해주는 Interceptor, 요청을 보낼 때 어떻게 작동하고 있는지 Console의 출력을 통해 보여주는 EventMonitor 기능등이 있다. 이러한 기능들은 쉽게 사용할 수 있도록 기본적인 구현이 제공된다. Alamofire에서 기본적으로 구현된것만으로 많은 오픈 API를 대응할 수 있다. 구글링을 통해 Alamofire를 사용하는 코드를 보면 대부분이 이 코드 혹은 이 코드에서 크게 벗어나지 않을 것이다. AF.request("http..
이번 새싹 LSLP에서 많은 API를 사용하게 되면서 API마다 response값을 별도로 관리함이 필요하다고 느꼈다. http프로토콜을 이용해 response를 받을 때, statuscode를 이용해 response의 유효성을 검증하고, 응답 에러(사용자가 유효하다고 정의한 response를 제외한 response)를 받을 경우 이를 대응해야 한다. 이를 위해 다음과 같이 필요한 기능을 및 문제를 정의했다. API가 많아 질수록 응답 에러 정의에 어려움과 처리가 어려워짐 응답 에러마다 수행할 작업 정의 (alert로 이벤트 전달, 재시도 등..) alert에 들어갈 description과 title 핸들링 API 응답 에러 정의 및 처리의 어려움 API 양이 많아질수록 이를 한 군데 에서 정의 및 처리..
URLSession으로 http프로토콜을 이용해 POST, PUT 통신을 할 때 기본적으로 Reqeust의 헤더에 Content-Type에 application/json을 붙여서 사용했는데, 이번에는 http프로토콜을 이용해 multipart/form으로 이미지를 전송해 보았다. multipart/form 방식은 기존 application/json과 다르게 body를 json으로 보내는 것이 아닌 보내는 데이터를 여러 개로 쪼개서 보내는 방식이다. Multipart/form Header func settingHeader(identifier: String, request: URLRequest) -> URLRequest { var copyReq = request let contentType = "multi..
권한을 요구하는 작업을 수행할 때, 사용자에게 권한을 요청하는 알람을 뛰운다. 또, 사용자가 권한을 거절해 버리면, 설정으로 가서 권한을 부여하도록 Alert 창을 띄운다. 또한 HIG에서는 권한 요청이 필요한 타이밍에 권한을 요청하라고 하고 있다. 즉 시작하자마자 필요한 권한을 모조리 요구하지 말라는 말. 따라서 여러 화면마다 권한 요청을 해야한다면 많은 중복코드가 생길 것이다. 그래서 protocol을 이용하여 권한 요청/각 권한에 따른 설정 이동 Alert를 표시하는 기능을 채택하면 사용할 수 있게 구현해 보았다. Alert를 화면에 띄우는 작업을 protocol의 extension을 이용해 구현했다. protocol Alertable {} extension Alertable where Self: ..
MVVM Inout패턴 ViewController -> ViewModel로 데이터나 이벤트를 Input으로 전달, ViewModel -> ViewController로 데이터나 이벤트를 Output으로 전달하는 구조. Input, Output으로 입출력이 명확하게 나뉘어지기에 유지보수나 가독성을 향상시킨 디자인 패턴 예시 - 아이튠즈 검색 구조 Input: SearchBarText, SearchBarTapSearchButton 이벤트 Output: isLoading, searchError, Search Result 시행착오 tapSearchButton 이벤트 스트림으로 에러처리 한 경우 func transform(input: Input) -> Output { let searchResult: Publis..