작년에 퇴사한 곳의 모바일 서비스 "위치위치"의 개선점들을 iOS개발 관점에서 생각해보았습니다. 이를 유지보수하고, 회사 직원들과 이를 사용하면서 느낀 불편한 점들을 기준으로 개선점들을 고민해보았습니다. 개발자 관점에서 개선해야 된다 생각한 내용들. 1. 하나의 포스트 기준, 로딩속도가 평균 2~3초정도 걸림. 2. 과도한 모바일 데이터 사용 3. 많은 게시물을 업로드한 사용자 페이지 방문 시 앱 종료 고민한 내용 1. 하나의 포스트 기준, 로딩속도가 평균 2~3초정도 걸림. - 모바일에서 사진, 동영상 촬영 후 서버에 업로드 시 해당 이미지, 동영상의 용량을 줄여 서버에 업로드한다. 예를 들어 3MB의 이미지를 300KB의 크기로 resize하여 업로드를 합니다. ( 이미지 리사이즈 방법 : https..
저번에 주입한 의존성 주입 코드를 테스트해보겠습니다. 1. 서버가 없다 가정하고, 목데이터 책 펙토리 생성 후 책 정보를 가져오기. 2. 테스트 코드 추가, 실행 3. 서버가 생겼다 가정하고, 목데이터로 된 펙토리, 서버에서 가져오는 로직으로 바꾸기. 4. 테스트 코드 실행 의존성 주입을 함으로써 코드 테스트가 간편해진 이유는 "서버에서 책을 가져온다"는 동작을 추상화 했기에!! 의존성 주입의 필요성을 저번 포스트와 함께 작성하다 보니, 이의 필요성을 느끼는 것 같습니다. class MyTest: XCTestCase { let bookMakable = MockBookFactory() let testMockClass = TestMockClass() func testMockData() throws { let..
이번주 포스트의 주제는 NotificationCenter입니다. https://developer.apple.com/documentation/foundation/notificationcenter Apple Developer Documentation developer.apple.com A가 B에게 카톡을 보내면 B의 폰에 알림이 옵니다! A가 B에게 카톡을 "보내면" B의 폰에 "알림"이 옵니다. 어떠한 이벤트에 대해 구독하고, 해당 이벤트가 일어나면 알림을 주는 역할이 NotificationCenter입니다. NotificationCenter는 URLSession, UserDefault와 같이 default를 통해 싱글톤을 사용할 수 있습니다. NotificaiionCenter.default.post(na..
SOLID 중 D(DIP) -> Dependency Inversion priciple. 의존성 주입을 공부하였습니다. 의존성 주입 방법! 의존성 역전이 있고, 의존성을 당겨오는 방식도 있었습니다. 이를 도와주는 라이브러리는 스위프트에서 Swinject, Pure등이 있었습니다. 의존성 주입의 장점! 유지보수가 좋아진다. 테스트 하기 좋아진다. "이런 이유가 있으니 나는 의존성 주입을 공부하는거야~" 라고 생각 했는 데.. ??? : 의존성 주입 왜해? 나 : 결합도를 낮추고 응집도를 높여야 되니까! ??? : 왜? 나 : 결합도가 높다면, 한 곳에 변화가 생겼을 때, 해당 부분과 결합도가 높은곳에서 또 수정을 해야 할 수 있어. ??? : 그래? 잘 모르겠는 데? 그게 어떤 경우길래? 나 : .... ?..
얼마전 스승님과 "1주일에 1번씩 블로그 포스팅을 할 수 있도록 노력해보겠다."는 약속을 하였습니다. 그동안 공부하며 기능적인 내용들보다는 되게 많이 고민하고, 개인적으로 어렵다 느꼈던 내용들을 위주로 정리해 두려 합니다. 22년 첫번째 포스트 주제! 바로 GCD!!! ( 비동기로 하나의 데이터를 작업할 때 사용법 ) 얼마 전 API주소의 이미지들을 URLSession을 사용하여 가져오고, 이를 이미지배열에 하나씩 넣고 있었습니다. 근데 갑자기 쓰레드에서 오류가 나면서 이미지가 안들어 오더군요.. 오류가 난 이유가 비동기로 실행되는 작업들은 각각 다른 쓰레드에서 실행이 되고 (1번 쓰레드의 작업이 빨리 끝난다면 해당 쓰레드가 재활용 될 수 있음 ) 만약 작업내용이 하나의 자원에 접근하고 있다면!? cla..
보호되어 있는 글입니다.
저번 포스트에서의 목표를 그대로 RxAlamofire를 적용시켰습니다. RxAlamofire, RxCodable, RxSwift를 사용하였습니다. AirModel 클래스를 생성합니다. 방식은 저번과 같지만 Rx를 사용할 수 있다는 장점이 있습니다. Rx 사용 시 비동기로 받는 데이터를 조금 더 편하게 수정, 전달하고 사용할 수 있습니다. 이번엔 Rx를 사용하는 만큼 프로토콜 대신 PublishSubject를 사용하여 비동기로 데이터를 전달하겠습니다. RxAlamofire.requestData를 사용하여 이전과 같이 메소드, url, 파라미터를 전달합니다. 이후 Observable에서 저희는 Data를 사용하겠습니다. ( .map{$1} ) .map을 이용하여 json데이터를 파싱합니다. ( RxCodab..
대기오염 정보 공공api를 alamofire를 사용하여 가져와보겠습니다. 사용하시기전에 podfile에 pod 'Alamofire' 를 추가하셔야 합니다. Alamofire는 비동기로 데이터를 가져옵니다. 외부에서 데이터를 가져오는 작업은 비동기로 이루어집니다. get, post, download, delete, patch등이 있지만 이번에 가져올 데이터에서는 get을 사용해야 합니다. 먼저 AirModel이라는 model class를 만들어줍니다. airmodel의 코드입니다. alamofire를 사용하면 데이터를 비동기로 가져오기에 이를 옮기기 위해선 protocal을 사용해야 합니다. 그리하여 AirModelStateDelegate를 생성하였습니다. 먼저 import Alamofire를 작성합니다...
지난 포스트에 이어서 로그인화면을 구현해 보겠습니다. UI기능은 어느정도 완성하였으니 기능구현을 하겠습니다. 먼저 사용자의 email을 입력받는 TextField를 RxSwift를 이용하여 구독하겠습니다. 해당 부분은 ViewModel에 값을 보내는 Input의 값입니다. text = emailField의 입력된 Text값 orEmpty = text값이 비어있지 않을때 distinctUntilChanged() = 중복검사 (이전 text와 비교) debounce = 값을 검사하는 주기 1초 map = text값을 String으로 변환 이렇게 받은 값을 ViewModel에서 정규식을 이용하여 유효성을 검사한 후 비어있는지, 사용할 수 있는지, 없는지를 다시 View로 보냅니다. 다시 LoginView에서는..
거의 모든 서비스에서 사용되는 로그인 기능입니다. 목표 1. 사용자가 이메일 값을 입력할 때 마다 이의 유효성을 검사하여 알려준다. [RxSwift] 2. 키보드의 유무에 따라 다음 버튼의 크기, 위치가 애니메이션으로 바뀐다. [UI] MVVM을 적용시켰습니다. 개발과정 MVVM의 틀을 잡은 후, (https://github.com/sergdort/CleanArchitectureRxSwift#application-1 를 참고하여 설계하였습니다.) UI편 1. UI그리기. 2. 키보드의 유무에 따라 다음 버튼의 크기, 위치 애니메이션으로 변경시키기. 3. 이메일값의 유무에 따라 UI를 변경하여 사용자에게 해당 메일의 유효성을 확인시키기. 기능편 1. EmailTextField를 구독하여 실시간으로 변경되는..