본문 바로가기

iOS

(31)
Reactor Kit View를 채택하는 VC에 bind(reactor:) 메서드가 실행되지 않음 문제 상황- View를 채택하는 VC에 bind(reactor:) 메서드가 실행되지 않음원인 분석- Coordinator에서 push메서드에 reactor를 생성자에 주입하니 메서드가 실행되지 않았음 /// 운동 편집 화면 전체 화면으로 push func pushEditExcerciseView(routineName: String) { let reactor = EditExcerciseViewReactor(routineName: routineName) let editExcerciseVC = EditExcerciseViewController(reactor: reactor) navigationController.pushViewController(ed..
Github Action으로 CI 구성하기 기존에 했던 프로젝트를 하면서 원격 develop 브랜치에 머지할 때 빌드가 안되는 코드들이 들어오는 경우가 많았습니다.매번 머지할 때 마다 빌드 체크하고, 로컬에서 원격으로 올라오지 않은 코드들 검수하는 과정이 필요했었습니다.이것 또한 많은 시간이 들었는데요..이번에 출시하는 앱을 만들면서 비즈니스 로직을 더 탄탄하게 만들기 위해 테스트코드를 구성하고,빌드 체크를 매번 진행하여 안정성을 높일 수 있게 CI를 구성하기로 했습니다. CI란?CI란 Continuos Integration의 줄임말로 해석하면 지속적 통합입니다.여러 개발자들이 같은 애플리케이션의 다른 기능을 동시에 작업합니다.개발된 각각 기능들을 특정한 날짜를 지정하여 모든 코드를 병합하는 경우, 충돌 해결이나 코드 수정 등 많은 시간을 소모하..
왜 POP? (WWDC15) OOP에서의 클래스 특성캡슐화: 관련 데이터와 동작들을 모아볼 수 있다.접근제어: 코드 외부와 내부를 구분짓는 벽을 세워 외부에서의 접근에 제한을 둘 수 있다. 이를 통해 정보에 대한 불변성을 유지할 수 있다.추상화: 추상화를 통해 관련시킬 수 있는 정보들을 모아둔 클래스를 만들 수 있다.NameSpace: 소프트웨어가 커지면서 발생할 수 있는 충돌을 대비하는데 도움을 주는 네임스페이스를 제공, 여기서 네임스페이스는 내부 식별자에 사용될 수 있는 유효 범위를 제공하는 선언적 영역Expressive Syntax: 클래스를 통해 프로퍼티, 메서드등의 흐름으로 이해하기 쉬운 구문을 작성할 수 있다.Extensibility(확장성): 작성된 코드에 언제든지 기능을 추가할 수 있다.위 특성을 struct와 enu..
[트러블 슈팅] DiffableDataSource 컬렉션 뷰에 다양한 데이터모델을 사용하기 😐 문제 배경프로젝트 진행중에 CollecionView를 중복으로 사용하면서 발생하였습니다.검색 페이지예매내역 더보기 페이지찜 목록 더보기 페이지 위 3개의 View는 모두 다른 ViewController입니다.그리고 안에 있는 컬렉션 뷰는 각 VC에 생성 및 구성작업을 했습니다.구현하고 보니, 컬렉션뷰의 디자인이 동일한데 각 VC에서 생성하다보니 중복되는 느낌을 받았고, VC에 코드줄이 길어지면서 가독성도 떨어지게 되었습니다.-> 그래서 이를 하나의 컬렉션 뷰로 파일 분리하여 구성한 다음 재사용하면 VC가 더 간결해지겠다고 생각했습니다! 🤔 상황재사용 하기전에 각 컬렉션 뷰의 공통점이 있는지 파악을 먼저 했습니다.1. 3개의 컬렉션 뷰 모두 DiffableDataSource를 사용했습니다.2. 3개..
[트러블 슈팅] CoreData의 Entity Attribute의 타입을 변경한 경우 배경JSON으로 받아온 데이터 항목중 하나를 다른걸로 변경하고자 했습니다.위 사진은 JSON 항목중 일부를 나타낸 사진입니다기존에 CoreData에 time_last_update_utc인 String 타입 문자열을 저장하다가, time_next_update_unix로 항목을 변경해야 했습니다. 그래서 Int타입을 받기 위해 Attribute의 updateTime 타입을 String -> Integer 64로 변경했습니다.CoreData를 불러오는 메서드도 모두 Int형식으로 받도록 수정하였습니다. ⚠️ 문제발생 CoreData에 저장된 updateTime 속성을 Int타입으로 값 갱신하는 과정에서 치명적인 오류가 발생했습니다. Persistent store migration failed, missin..
메모리 사용량 확인을 위한 vmmap vmmap(Virtual Memory Map)vmmap이란 Xcode, macOS에서 사용하는 가상 메모리 매핑 도구입니다.특정 프로세스의 메모리 사용량을 맥 가상 메모리로 매핑하여 메모리 사용량을 보여줍니다.터미널에서 사용하며, 실 기기의 메모리가 아니라 맥 기반 메모리를 매핑하게 됩니다.  vmmap 사용방법Xcode에서 빌드 후 특정 프로세스중에서 확인하기 위해 break point를 걸거나 Debug Memory Graph를 열면 좌측에 프로젝트명 PID 번호가 나타나게 됩니다.터미널에서 해당 PID를 이용하여 vmmap을 실행할 수 있습니다.$ vmmap PID_DATA, _TEXT:  실행코드 및 전역변수malloc: 힙 영역malloc guard page: 힙 오버플로우를 방지용 영역stac..
UICollectionViewLayout과 UICollectionViewFlowLayout CollectionView는 TableView와 다르게 layout을 설정해주지 않으면 생성시 오류가 발생합니다.CollectionView 생성자에서 인자로 받는 UICollectionViewLayout이 있습니다.왠만한 레이아웃은 UICollectionViewLayout으로 할 수 있지 않을까? 싶었는데 CollectionView 생성 인자로 모두 들어갈 수 있다는 점에서 많이 헷갈렸습니다.이번 기회에 정리해보고자 합니다.  UICollectionViewLayouthttps://developer.apple.com/documentation/uikit/uicollectionviewlayout UICollectionViewLayout | Apple Developer DocumentationAn abstrac..
UIBeizerPath UIBeizerPathA path that consists of straight and curved line segments that you can render in your custom views.공식문서에 따르면, 사용자의 커스텀 뷰에서 렌더링할 수 있는 직선 곡선 세그먼트로 구성된 경로라고 합니다.해당 객체는 UIKit의 Drawing에 속해있는 클래스입니다.한마디로 사용자가 원하는 모양을 그려낼 수 있도록 도와주는 객체라고 생각하시면 됩니다. initUIBeizerPath를 생성하는데 기본으로 주어지는 모양들이 존재합니다.// 기본 생성public init()// 직사각형 모양 CGRect를 인자로 받는다. CGRect(x: ,y: , width: , height: ,) x y 는 그리기의 시작지..