[25.12.13] Tododok 트러블슈팅 - Coordinator 화면 전환 메서드, 어떤 방식으로 사용할까?
·
iOS/Swift
1. 문제 상황지난 MOUP 프로젝트에서 처음으로 Coordinator를 사용해보고 꾸준히 든 고민, coordinator를 vc에 주입하는 등 이러한 과정들이 정말 꼭 필요하며 최적의 방법인가?를 고민했다. ViewController 측에서 어느 이벤트를 통해 화면 이동을 해야한다는 판단을 하게 되면 화면 전환을 담당하는 coordinator의 메서드를 쓰도록 해야 하는데, 이 과정 속에서 지난 번엔 VC 내에 weak var coordinator를 통해 매번 주입받고 internal(접근제어자를 쓰지 않은 기본상태) 메서드를 사용해야 했는데 이 과정이 반복될수록 꽤나 번거로웠다.화면 전환이 들어가는 ViewController를 생성할 때마다 파라미터로 coordinator = self라는 코드를 넣어..
[TIL / 25.10.11] Combine,, 실습과 함께 훑어봤어요 2
·
iOS/Swift
1. 목표https://jsonplaceholder.typicode.com/users유명한 open api 중 하나인 해당 주소에서 얻어온 users를 테이블뷰에 띄우는 실습을 해봤다. 제대로 구현이 된다면 아래와 같은 결과가 나올 것이다.2. Presentation Layer 우선, 프로젝트 내 아키텍처는 새로 들어가는 프로젝트와 일부 유사하게 clean architecture 기반으로 가져가고 그 외 네트워크는 urlsession 사용한다. 전체적으로 퍼스트파티 위주로 구현한다. 우선 View에 대해선 반응형을 쓰지 않을때와 같았다.Rx를 썼을 때엔 RxCocoa를 사용해 UI 컴포넌트에 대해 여러 기능들을 제공받았는데, Combine엔 RxCocoa같은 게 없다고 한다..!사실 있는데 아직 처음 공..
[TIL / 25.10.11] Combine,, 실습과 함께 훑어봤어요 1
·
iOS/Swift
새 프로젝트에서 Combine을 도입해보기로 결정했기 때문에, 마침 배워보고 싶던 부분이라 공부해봤어요반응형 프로그래밍을 왜 쓰는건지 다시 되짚어보고,, 기존 RxSwift할 때와 어떻게 다른지 중심으로 보고 간단한 open api 받아와서 tableView에 바인딩하는거까지 해보겠습니다~ 1. 반응형 프로그래밍(Reactive Programming)반응형 프로그래밍은 값의 변화(데이터, 이벤트 스트림)가 마치 데이터 흐름처럼 연결/구독되고, 변화가 생길 때마다 자동으로 반응이 흘러가는 것. 비동기들은 기본적으로 예측 어려운 시점에 발생(입력, 네트워킹, 타이머, 센서 등)하기에, 많은 이벤트, 콜백, 비동기 작업을 하나의 Stream으로 간단히 체인/구독해서 관리하려는 개념이다. 퍼스트 파티 기준으로는..
[25.08.14] MOUP 리팩토링 및 트러블슈팅 - 동적 높이를 가지는 테이블뷰 셀
·
iOS/Swift
이번엔 정말 한참 잡고 있었던 것 같은데 ...1. 리팩토링한 부분기존 홈 내 알바생이 본인의 근무지를 볼 수 있었고 셀을 탭하면 확장 및 축소가 되어 급여에 대한 상세한 요소들을 볼 수 있어야 했음요런 느낌으로 했어야 했는데 리뉴얼 전 프로젝트에서는 스택뷰로 하게 되면 계속 제약조건 경고와 함께 UI 관련 이슈가 끊이질 않고 원하는대로 되지도 않아서 데드라인이 얼마 남지 않았기에 해당 방식으로 진행함. func setConstraints() { containerView.snp.makeConstraints { $0.top.equalToSuperview().inset(4) $0.directionalHorizontalEdges.equalToSuperview..
[25.08.04] MOUP 트러블슈팅 - .xcconfig 내 url 설정 시 주의사항
·
iOS/Swift
1. 문제 상황구글 로그인을 위해 데이터 레이어를 모두 임시 구현해두고 테스트를 하는데 No endpoint 경고가 뜸NSLocalizedDescription=특정 호스트 이름을 가진 서버를 찾을 수 없습니다.분명 baseURL을 xcconfig에 넣고 이를 info.plist에 등록해서 가져다가 쓴건데...?라우터 패턴 내부에 var baseURL: URL { guard let url = URL(string: NetworkConstants.baseURL) else { fatalError("Invalid base URL") } print("baseURL은 \(url)입니다") return url }// 생략 ...func asUR..
[25.07.31] MOUP 트러블슈팅 - tableHeaderView 레이아웃 제약 경고
·
iOS/Swift
1. 문제 상황홈 화면 상단에 유동적이지 않은 뷰(헤더)를 리뉴얼 전 프로젝트에선 tableHeaderView로 해결해보려 했으나 제약 경고 해결을 시간 내로 빠르게 해결하지 못할 것 같아 섹션 헤더로 넣어 해결했다. 이번 리뉴얼 버전에선 이 헤더가 사실 화면 전체의 상단 영역을 책임 진다고 생각하여 tableHeaderView로 구현해보고 싶어 시도했으나 계속 제약 조건 경고가 뜸 내부적으로 leading, trailing에 대한 제약조건 16을 달아둔 것들이 문제가 됐고 마지막 사항은 HomeHeaderContainerView라는 헤더 뷰 자체가 width가 0이라서 문제가 된다고 한다.tableView.snp.makeConstraints { $0.top.equalTo(topBar..
[25.06.24] MOUP 트러블슈팅 - Listener와 Rx의 timeout
·
iOS/Swift
1. 문제 상황홈 내 테이블뷰에 들어갈 데이터를 불러오는 과정에서 combineLatest를 호출한다.extension HomeViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { guard let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: HomeHeaderView.identifier) as? HomeHeaderView else { return UIView() } Observable...
[TIL / 25.05.27] 날씨 앱 main 페이지 구조 트러블슈팅
·
iOS/Swift
1. 문제 상황현재 기획 상 위 아래로 한페이지씩 pageable하게 구현함. mainPageViewController(UIPageViewController) 하위 뷰컨트롤러들에 위 아랫 UIViewController를 연결해둠.근데 첫번째 페이지에서 화면을 아래로 잡아끌면 새로고침이 되어야함. PTR(Pull To Refresh)가 필요한데,, 문제의 현 구조. 대충 구조만 보고 넘겨주세요class MainPageViewController: UIPageViewController { private let disposeBag = DisposeBag() private let viewModel: PageViewModel private let mainViewModel: MainViewModel ..
[TIL / 25.05.18] 의존성 주입 담당 DIContainer를 처음 적용해보았습니다
·
iOS/Swift
DIContainer란?앱의 각 객체들이 어떻게 구성되고 주입될지 정의해주는 중앙 조립소.UseCase, Repository, ViewModel, ViewController와 같은 컴포넌트들을 하나의 컨테이너에서 만들어주기 때문에, 객체 간의 생성 책임을 분리하고 코드 가독성을 높이는 데 도움이 된다. - 객체 간 생성 책임 분리란?누가 누구를 만들지 결정하는 책임을 명확히 나누는 것임. class MainViewController: UIViewController { private let viewModel = MainViewModel( searchUseCase: SearchBooksUseCase( repository: BookRepository(networkServi..
[TIL / 25.05.13] BookSearchApp Lv 3 트러블슈팅 - Core Data 크래시
·
iOS/Swift
시간이 많이 없어 주 정보원은 GPT와의 스무고개뿐이라, 이중 검증이 아직 덜 된 부분이 많구요..!제가 생각하기에 확실하지는 않지만 "이게 맞는 것 같다"싶은 부분들로 글을 쓰겠습니다. 1. Persistent Store 초기화 전 Entity(context:) 사용 시 크래시 발생An NSManagedObject of class ‘BookEntity’ must have a valid NSEntityDescription.이 메시지와 함께 crash가 났는데담기 버튼을 누르면 코어 데이터에 CartBookEntity를 저장하는 로직을 실행하도록 하는 과정에서 문제가 생겼다.관련 코드를 보며 아직 코어 데이터 생태계에 아무것도 몰라서 찾아봐도 무슨 말인지 모르겠고 gpt랑 스무고개를 진행했다. "persi..