iOS 13

[iOS] propertyWrapper를 활용한 UserDefaults 캡슐화

프로젝트를 진행하다보니, UserDefaults 값을 이곳 저곳 쓸일이 많았고 반복되는 코드들에 불편함을 느껴@propertyWrapper 속성을 사용하여 코드의 간결함, 유지보수에 보탬이 되도록 개선해보려 합니다.기존 방식enum UserDefaultsKey: String { case userId case email case password case accessToken case refreshToken case nick case profileImage case autoLogin var key: String { return self.rawValue }}UserDefaults.standard.set("user@example.com", for..

[iOS] API 통신시, response값이 없을 경우

문제점제공받은 API를 사용하다보니, performRequest 메서드는 응답값이 있는 통신만 가능하였고, 응답값 없이 응답코드만 전달해주는 통신에서는 오류가 발생하였다.임의로 빈 Struct를 만들어서 decodingType에 넣어봐도 실패하였다.아래의 메서드로는 서버 요청시, response status code만 주고 response값이 없는 요청은 받을 수가 없었습니다. static func performRequest(route: Router, decodingType: T.Type?) -> Single { return Single.create { single in do { let urlRequest = try route.asURLRe..

[iOS] 제네릭 활용, Network 메서드 통합 작업

Service Level Project를 구현하다 보니, 기존에 작업하였던 Project에 비해 수 많은 API 통신 메서드가 필요하였습니다.처음 프로젝트를 시작할때는 로그인, 회원가입, 이메일 중복검사 만 이루어졌지만, 기능 구현을 차근차근 완성을 하다 보니 포스트 조회, 포스트 작성, 댓글 조회, 댓글 작성, 댓글 수정, 프로필 조회, 팔로우 조회 등등 수 많은 API 메서드를 작성하게 되었고,코드의 간결성 및 재사용성을 높이고 유지보수성을 개선하기 위하여 제네릭을 활용하여 메서드 통합 작업의 필요성을 느끼게 되었습니다.이전 코드struct NetworkManager { static func createLogin(query: LoginQuery) -> Single { return S..

[iOS] TableView + TextField 포함되어 있는 View에서 Keyboard 사용시 Layout 이슈

이번 프로젝트에서는 IQKeyboard 라이브러리를 적용하여 회원가입, 로그인 뷰 등에서 키보드 관련 Layout 이슈는 없었다고 생각하였습니다.그치만 역시 세상에 쉬운 일은 없는법... Simulator에서 대부분 키보드를 Hide하여 테스트하다보니 이슈를 뒤늦게 발견하였습니다..댓글View를 상단에 TableView, 하단에 TextField 를 배치하였는데 TextField 클릭시 IQKeyboard 특성상 TableView의 전체가 모두 올라가버리는 이슈를 마주하였씁니다. 현상은 아래의 이미지와 같습니다!Issue Preview접근한 해결 방법우선 해당 뷰에서는 IQKeyboard 기능을 OffIQKeyboardManager.shared.disabledDistanceHandlingClasses =..

[Network] 빈배열일때, 빈 String ("")으로 응답 하는 이슈

API 응답 값 중, [Item] 배열이 들어오는 곳에 값이 0개 일때, “”: String 으로 응답을 전달하여 통신오류가 발생하는 이슈모델은 [Item] 타입이므로, 타입 불일치로 네트워크 통신이 실패로 처리됨API 모델 내부에, Items가 존재하면 디코딩, 아니면 빈문자열인지 확인 후 nil로 설정 하는 이니셜라이저 구현하여 해결완료 //items가 0개 일떄 String("")으로 전달받는 것을 처리 init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) numOfRows = try container.decode(Int.self, forKey: .nu..

[iOS] Optimistic UI 적용

기존 구현 화면구조상 북마크 저장을 할 때 마다 추가적인 API 통신이 이루어 지므로,사용자 입장에서 데이터 통신을 하고 있으니 잠시 기다려 달라는 의미로 Indicator 를 show하고, 데이터 통신이 종료되면 dismiss 하였습니다.A total of 78 percent of consumers have felt negative emotions as a result of a slow or unreliable website.출처: https://www.techradar.com/news/world-of-tech/roundup/consumers-dump-slow-websites-1080742사용자 입장을 고려하여 Incidator를 구현하였지만, 오히려 너무 잦은 Indicator 남용으로 인해 사용자에..

[iOS]Snapkit 라이브러리 makeConstraints 관련 이슈

searchBarCancelButtonClicked 메소드를 통해 TotalVC에 다시 돌아올 때, Hidden처리 및 레이아웃을 재설정하였는데 콜렉션뷰의 레이아웃이 돌아오지 않는 현상평소에 주로 사용하던, makeConstraints 말고 remakeConstraints 키워드 활용.한번 makeConstraints 로 레이아웃을 잡은 후, makeConstraints를 또 실행할 경우 레이아웃 충돌을 일으키므로remakeConstraints 로 구현!