전체 글 (359) 썸네일형 리스트형 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의 같은 데이터 apply로 인한 오류 문제 배경DiffableDataSource를 사용하여 두개 섹션의 셀을 나타내도록 구성하였습니다.검색결과와 최근 본 책의 섹션은 같은 데이터모델을 사용하고 있습니다.검색결과의 셀을 선택하면 책의 자세한 정보가 담긴 페이지가 보여지고, 자동으로 최근 본책의 섹션에 저장되도록 설정하였습니다.문제 원인DiffableDataSource를 사용해서 고유한 셀이 아닌 중복적으로 나타나 앱이 튕겨버린다.이는 중복된 셀을 안보여주는 점은 있지만.. 문제는 팅기고 알게된다는것.. 매우 치명적이다. 해결한 방법데이터모델 수정가장 직관적인 방법으로 같은 데이터를 가져도 데이터 항목중 하나를 다르게 두는 방법이다.struct Book: Hashable, Decodable { let title: String let.. 멀티 스레딩 프로세스(Process): 운영체제로부터 자원을 할당받은 작업의 단위스레드(Thread): 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위 모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행된다.프로그램을 실행하면 해당 프로그램은 메모리에 올라가게 되고, 운영체제로부터 시스템 자원을 할당받아 프로그램을 실행시킨다. 스레드 특징스레드는 프로세스 내부에 존재하므로 프로세스의 데이터 영역에 접근이 가능하다.스레드끼리 서로의 데이터에 접근 가능하다.스레드도 하나의 작업단위라 병렬처리가 가능하다.프로세스의 메모리영역은 code, data, stack, heap으로 나뉘지만, 스레드는 stack 메모리 공간만 갖는다.하나의 프로세스 내부에 여러개의 스레드를 가질 수 있다.싱글 스레드: 하.. [트러블 슈팅] 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.. Swift에서 인스턴스를 생성하는 방법들 🤨 UI 컴포넌트 인스턴스를 클로저로 생성하는 이유가 뭘까?이 글은 위 궁금증으로 시작되었습니다.앱을 개발할 때 UI컴포넌트를 사용하기 위해 ViewController에 인스턴스를 생성하는 과정이 필요했습니다.class ViewController: UIViewController { // 인스턴스 생성 후 메서드를 통해 해당 인스턴스의 속성 초기화 let label1 = UILabel() func configureUI() { label1.text = "Hello, World!" label1.textColor = .black label1.textAlignment = .center label1.font = .boldSystemF.. 이전 1 2 3 4 ··· 45 다음