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..
문제 swiftUI로 프로젝트를 진행하다가 PHPickerViewController를 이용해서 이미지를 선택하는 기능을 구현하려고 UIViewControllerRepresentable로 감싸서 이를 sheet로 띄우니 끌어서 닫는 기능이 작동하지 않았다. 일단 뷰 계층을 살펴보니 PresentationHostingController위에 PHPickerViewController가 덮여있는 것을 볼 수 있다. PUPickerRemoteViewController는 뭔지 모름. (검색해도 안 나옴) 원인 구글링 좀 해보니 UIKit의 pan gesture 같은 제스처 이벤트가 UIKit의 ViewController에서 일어날 시, swiftUI의 뷰에 전달하지 않고 ViewController가 그대로 받아 버..
권한을 요구하는 작업을 수행할 때, 사용자에게 권한을 요청하는 알람을 뛰운다. 또, 사용자가 권한을 거절해 버리면, 설정으로 가서 권한을 부여하도록 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..
기획 의도 내 취미는 양서류, 절지류, 파충류 같은 희귀 애완동물을 키우는 것이다. 요즘은 취업 준비 때문에 대부분 분양 보냈지만... 아무튼 이런 취미를 가졌기에 희귀 애완동물 커뮤니티에 자주 들어가는데 보통 한두 마리를 키우는 게 아닌 몇십 ~ 수백 마리 단위로 키우는 사람들도 자주 보이고, 자신의 개체 관리 기록 (먹이 급여나 탈피 같은 기록할 사항)을 메모장에다가 기록해 두는 사람들도 종종 보았다. 그래서 이런 희귀 애완동물을 관리한 기록을 저장할 수 있는 앱이 있으면 좋겠다고 생각했고, 희귀애완동물을 관리하는 것을 목적으로 앱을 기획했다. 앱 디자인 일단 우리나라에서 희귀동물하면 보통 파충류, 양서류, 절지류로 나눠지고 가장 많이 키워진다. 그래서 펫 리스트 화면에서 이 3가지의 종을 필터링해서..
늘 헷갈렸던 건데, 이번에 배워서 까먹을 때마다 보려고 정리해 둔다. Observable의 주 특징 unicast 네트워크 수업에서 들었던 unicast. 네트워크에서는 프레임을 딱 하나의 목적지로만 보내는 것을 의미하는데, 여기서는 약간 다른 뜻으로 사용된다. Observable을 여러 군데서 subscribe 할 때마다, create를 호출해서 Observable을 새 성한다. class A { func push() -> Observable { return Observable.create { observer in observer.onNext(Int.random(in: 1...100)) return Disposables.create() } } } 다음과 같이 랜덤 한 Int값을 내보내는 Observab..