본문 바로가기

iOS

(19)
[iOS] Combine 보호되어 있는 글입니다.
[iOS] Custom ContainerViewController 활용시 주의할 점 ChildViewController로 추가/제거 될 때 willMove, didMove 메소드가 자동으로 호출됩니다. 코드로 ContainerViewController를 구현했다면 child를 추가할 땐 didMove, 제거할 땐 wilMove 메소드를 직접 호출해주어야 합니다. 트랜지션도 커스텀했다면 트랜지션이 종료된 후 적절한 시점에 메소드를 호출해주면 됩니다. 참고로, child를 제거할 때 didMove가 자동으로 중복되어 호출될 수 있습니다. func addChild() { let viewController = ChildViewController() addChildViewController(viewController) // addChild 후 호출, 커스텀 트랜지션이 있다면 완료 후에 호출 vi..
[iOS] Swift 참조 타입이 앱 기동 시간에 안 좋은 영향을 끼치는 이유 (번역) 앱 기동(launch) 경험은 앱 사용자에 대한 첫 인상입니다. 앱이 시작될 때까지 기다리는 시간은 수치상으로는 짧지만 실제로 짧게 느껴지지 않을 수 있는 중요한 시간입니다. 해당 앱을 하루에 여러번 사용되는 경우 사용자는 앱 기동을 계속해서 기다려야 합니다. Apple은 첫 번째 프레임을 400ms 미만으로 그릴 것을 권장합니다. 이렇게 하면 Springboard의 앱 열기 애니메이션이 완료 될 때 앱을 사용할 수 있습니다. 400ms 시간 내에서 개발자는 실수로 앱 시작 시간을 늘리지 않도록 유의해야 합니다. 그러나 앱 기동은 하는 일이 너무 많아서 정확히 어떤 것이 기동 시간을 늘리는지 알기가 어렵습니다. Swift 참조 유형이 바이너리 크기와 느려진 앱 시작 시간에 어떻게 영향을 미치는지 알아보도..
[iOS] DispatchSourceTimer로 일시정지 구현이 쉬운 타이머 만들기 스택오버플로우에 일시정지와 재시작이 가능한 Timer를 구현하는 방법에 대한 질문에 Timer를 invalidate 시켰다가 새로운 Timer를 할당하는 등의 까다로운 방법들로만 답변이 달린 것을 보았습니다. 내가 본 질문과 답변들.. Pausing and Resuming a Timer in iOS Swift : Pause and Resume NSTimer 만약 DispatchSourceTimer를 알고 있더라면 좀 더 쉽게 해결가능한 문제입니다. 1초마다 시간을 출력해야 한다면 아래처럼 Timer를 만들 수 있습니다. var timer: DispatchSourceTimer? if timer == nil { // 1 timer = DispatchSource.makeTimerSource(flags: [],..
[iOS] 클래스의 모든 프로퍼티들이 궁금할 땐? 디버깅을 하다보면 특정 인스턴스에 어떤 프로퍼티들이 어떤 값들로 할당되어 있는지 로그로 남겨 한 눈에 보고싶을 때가 있습니다. 이 때 사용하면 유용한 방법을 공유하도록 하겠습니다! extension NSObject { func properties() -> [String] { var results: [String] = [] var count: UInt32 = 0 let myClass: AnyClass = self.classForCoder // 프로퍼티들 리스트 조회 let properties = class_copyPropertyList(myClass, &count) for index in 0..
[iOS] NSPredicate 문법 정리 NSArray를 필터링 할 때, CoreData를 사용할 때 Predicate 문법을 사용하여 필터링 하곤 합니다. 이 때 주로 사용하는 문법들을 정리해보겠습니다. let request: NSFetchRequest = Entity.fetchRequest() let predicate = NSPredicate(format: "id == %@", id) request.predicate = predicate CoreData에서 데이터 조회(fetch)할 때 사용하는 방식은 대부분 위와 같을 것 입니다. NSPredicate 생성자 중 format 문자열에 검색조건을 지정하는 방법을 주로 사용합니다. format 문자열은 대소문자를 구별하지 않습니다. Predicate Keyword 들은 대문자로 작성하는 것이 ..
[iOS] fullScreen? overFullScreen? over가 붙으면 무엇이 다를까 (UIModalPresentationStyle) UIViewController의 속성중에 modalPresentationStyle 란 것이 있습니다. 해당 뷰컨트롤러가 모달 형식으로 띄워질 때의 스타일을 지정할 수 있는 것이죠. var modalPresentationStyle: UIModalPresentationStyle { get set } 스타일로 지정할 수 있는 타입의 기본값은 .automatic 이고 지정할 수 있는 값은 총 11가지가 있습니다. 이 중에서 .fullScreen과 .overFullScreen, .currentContext와 .overCurrentContext 처럼 prefix로 over가 붙으면 어떤 차이가 있는지 알아보려고 합니다! 정의를 먼저 살펴보면, 차이점은 presentation style 과 view presentat..
[iOS] 로컬 푸쉬 알림 구현 방법 (Local Notification) Swift로 로컬에서 푸쉬 알림을 어떻게 띄우게 구현하는지 알아보도록 하겠습니다. 기본 구조 Local Notification은 크게 3가지 파트로 나뉩니다. content, trigger, request 입니다. 이 세가지를 통하여 Local Notification을 쉽게 구현할 수 있습니다. Content content는 사용자에게 어떤 내용을 보여줄지에 대한 정보를 담고 있습니다. title, body, badge number, userInfo, attachments 등이 있습니다. userInfo는 예상하다시피 원하는 정보를 모두 담을 수 있는 Dictionary 입니다. 알림을 사용자가 눌렀을 때, userInfo에 들어있는 정보를 접근하여 활용할 수 있습니다. Trigger trigger에는 ..