2020/01 19

Xcode 컴파일 최적화하여 빌드 속도 올리기

안녕하세요. 이번 글에서는 Xcode에서 빌드 속도를 조금이나마 향상시키기 위해서 컴파일 최적화할 수 있는 여러 방법들을 소개하려고 합니다. 목표 Xcode 컴파일 최적화하여 빌드 시간을 최대한 줄이는 것입니다. 시작 전 환경 설정 - 컴파일 시간을 측정할 수 있도록 타이머 활성화 defaults write com.apple.dt.Xcode ShowBuildOperationDuration -bool YES - DerivedData 삭제 rm -rf ~/Library/Developer/Xcode/DerivedData 진행하고 Clean -> Build를 진행하면 아래 화면과 같이 컴파일 시간이 나오는걸 보실 수 있습니다. 1. Xcode New Build System Xcode9에서 애플은 Swift로 작..

iOS 2020.01.19

[iOS] MVVM패턴이란

MVVM이란? MVVM은 Model - View - ViewModel의 약자로 소프트웨어 아키텍처 패턴입니다. (Model은 데이터, View는 유저 인터페이스, ViewModel은 뷰와 모델 사이를 연결) Model(모델)은 어떤 부분을 책임지고 있나요? 데이터 모델, 데이터 접근 레이어, 비즈니스 로직등이 포함되어 있습니다. 모델은 데이터를 얻거나 저장하거나 지우거나 업데이트에 대해 알고 있습니다. 이 작업들은 뷰모델에 의해 시작되며 모델이 데이터에 대한 작업을 마치면 뷰 모델에게 결과를 알립니다. 모델은 뷰모델이 소유하고 있고, 뷰나 뷰모델이 모델에 대해 들여다볼 수 없습니다. View(뷰)는 어떤 부분을 책임지고 있나요? 사용자 이벤트를 수신하고 데이터를 표시하는 유저 인터페이스를 책임집니다. (..

iOS 2020.01.05

[Swift] Extension이란

안녕하세요. 이번 글에서는 Swift에서 강력한 기능인 Extension에 대해서 간단하게 정리하려고 합니다. Extension이란 쉽게 말해서 새로운 기능을 추가한다는 개념입니다. 어떤 것들을 추가할 수 있나요? Computed Properties(연산 속성) Double 타입에 km라는 연산 속성을 추가하는 예제입니다. extension Double { var km: Double { return self * 1_1000.0 } } 하지만 저장 속성은 추가할 수 없습니다. 그 이유는 추가하기 위해서는 새 값을 저장하기 위해 추가 메모리가 필요한데 extension은 그런 작업을 관리 할 수 없습니다. Initializers(이니셜라이저) Default Initializers는 추가할 수 있습니다. 하지..

Swift 2020.01.05

[iOS] 멀티 스레드(Multi Thread) 구현 시 고려해야될 것들

안녕하세요. iOS앱을 개발하면서 멀티 스레드로 앱을 구현하다보면 예상하지도 못한 곳에서 죽는 경우를 경험해보셨을 것입니다. 그래서 이번 글에서는 멀티 스레드를 구현하면서 고려해야될 것들을 정리해보려고 합니다. 멀티스레딩이란? 여러 개의 스레드가 동시에 진행되는 것을 의미합니다. 하나의 프로세스 내에서 여러 개의 스레드가 존재하고, 스레드들이 프로세스의 자원을 공유하되 실행은 독립적으로 이루어지는 구조입니다. 멀티스레딩의 장점 1. 메모리 공간과 시스템 자원 소모가 줄어든다. 2. 프로세스간 통신 방법에 비해 스레드간의 통신 방법이 간단하다. -> 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고 받기 때문) 멀티스레딩의 단점 1. ..

iOS 2020.01.05

[iOS] iOS13 앱 푸시 장치 토큰(deviceToken) 관련 이슈

안녕하세요. 이번 글에서는 iOS13 환경에서 deviceToken을 가져올 때 달라진 점에 대해서 공유하려고 합니다. 달라진 점 iOS12 환경에서는 deviceToken을 가져오는 메소드에서 deviceToken 파라미터 데이터 형식은 iOS13 환경에서는 {length=32,bytes=0x91e27cd9ddf20c69da8fa650e2a06f55...e60b100d99d60adf} 로 변경되었습니다. 대응 iOS12 환경에서 deviceToken 데이터를 String으로 아래의 방법으로 가공하였다면, func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Dat..

[iOS] iOS13 StatusBar Crash 이슈

안녕하세요. 이번 글에서는 iOS에서 상태바 컬러를 변경하기 위해 StatusBar를 가져오는 코드가 iOS13에서는 가져올 수 없는 이슈가 있어 현재까지 찾은 방법을 공유하려고 합니다. 이슈 저는 현재 이 코드를 이용해서 StatusBar를 가져오고 있었는데 UIApplication.shared.value(forKey: "statusBar") as? UIView Xcode11 GM Seed 2, iOS 13 환경에서 빌드하면 아래 로그가 찍히며 Crash가 발생합니다. Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'App called -statusBar or -statusBarWindow on ..

[Swift] SwiftLint 적용하기

SwiftLint란 Swift Style Guide에 기반한 Swift 언어 스타일 및 컨벤션 검사 툴. Github : https://github.com/realm/SwiftLint realm/SwiftLint A tool to enforce Swift style and conventions. Contribute to realm/SwiftLint development by creating an account on GitHub. github.com 사용목적 1. 협업을 진행하다보면 각자 다른 코딩스타일로 개발하고 있습니다. 룰을 맞추고 효율적인 코드리뷰, PR을 진행하기 위함. 2.코딩 스타일에 들어가는 리소스를 줄이고 기능 개발, 비즈니스 로직에 집중하기 위함. Install 1. Podfile pod..

Swift 2020.01.05

[iOS] 이미지 파일 Bitmap, Vector 방식 적재적소에 사용하기

Xcode로 개발하시면서 이미지 파일을 individual scales로 png파일을 넣을 때도 있고, single scale로 pdf파일을 넣어서 개발하신 적이 있으실겁니다. 하지만 문득 어느날 저도 모르게 single scale로 작업할 때도 있고, individual scales로 1x, 2x, 3x파일을 넣어 작업할 때도 있었습니다. 그래서 이번 포스팅에서는 이 두개의 차이점을 알아보고자 합니다. 이미지 표현 방식 이미지 표현 방식에는 비트맵(Bitmap)과 벡터(Vector)방식이 있습니다. 비트맵(Bitmap) 방식 비트맵 방식은 사각형의 픽셀이 모여 만들어진 이미지입니다. 그렇기 때문에 경계가 뚜렷하지 않고 확대했을 때 깨짐현상이 있습니다. 확장자로는 png, jpg, gif가 있습니다. 주..

iOS 2020.01.05

[iOS] UITableView에서 리로드할 때 스크롤 포지션 어긋나는 이슈

해당 이슈는 UITableView의 셀 높이들이 동적일 때 리로드할 때 스크롤 위치가 이상한 곳으로 설정되어집니다. 유연하고 부드러운 테이블뷰를 만들기 위해서는 heightForRowAt, estimatedHeightForRowAt 모두 적절히 지정되어야합니다. estimatedHeightForRowAt를 잘 지정해줘야 리로드할 때 예상한 셀 높이에 따라 스크롤 포지션이 정해집니다. 해결 방법 셀 높이를 저장할 프로퍼티를 추가하여 willDisplay에서 셀 높이를 저장하고, estimatedHeightForRowAt에서 저장한 셀 높이를 반환하여 해결. // MARK: - Property private var cellHeights: [IndexPath: CGFloat] = [:] // MARK: - w..

좋은 코드리뷰란?

리뷰할 코드는 가능한 300줄 이하로 작게 유지하기. 코드가 많을 경우 더 작은 덩어리로 나누는 습관 기르기. 너무 큰 작업을 커밋하기 보다는 작은 단위로 자주 커밋하기. PR보낼 때 목적을 분명하게 전달하기. 리뷰기간은 최대한 빠르게. PR에 설명이 부족하면 리뷰 시작 전 설명 구하기. (시간 절약할 수 있음) 좋은 리뷰어는 효율적인 코드를 작성하여 예제까지 제공하기. 결론 코드리뷰는 함께 성장하는 과정이라고 생각합니다. 모르는 것을 부끄러워하지 않고 서로 도움이 되고 건설적인 방식으로 피드백을 주고 받는 것이 중요!

Common 2020.01.05