[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으로 간단히 체인/구독해서 관리하려는 개념이다. 퍼스트 파티 기준으로는..
[TIL / 25.09.19] Swift는 왜 struct를 권장하는가
·
카테고리 없음
Swift에서 struct와 class는 비슷해보이지만, 언어 설계 방향과 코드 전체 구조적 특성, 확장성 등 핵심적인 차이를 가진다. class의 경우 Objective-C와의 호환에 맞춰서 도입된 참조 타입(Reference type)이며, 상속, 런타임 타입 체크, ARC(자동 참조 카운트) 관리를 지원한다.struct의 경우 값 타입(Value type)으로, 복사 시 데이터 전체를 새로 복제한다. 상속이 불가능하며, Swift에서 struct는 C의 struct와 달리 메서드, 프로퍼티, 확장, 프로토콜 채택 등 객체지향적 특성을 모두 가진다.이 struct를 클래스와 동등한 1등 시민(First-Class Citizen)으로 두고 실제 표준 라이브러리와 SwiftUI 등 시스템 전반에 기본 설..
[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..
[모업 MOUP] 프로젝트 첫 출시 회고
·
회고
우선, 우여곡절이 많았지만 최종 프로젝트로 개발한 앱 MOUP이 앱스토어에 출시되었다.https://apps.apple.com/kr/app/moup-%EB%AA%A8%EC%9D%B4%EB%A9%B4-%EC%97%85%EC%9D%B4-%EB%90%9C%EB%8B%A4/id6747497191 ‎MOUP - 모이면 업이 된다‎모이면 업이 된다 — MOUP 알바생의 근무 시간, 날짜, 월급을 자동으로 계산하고, 루틴(체크리스트) 기능으로 업무를 더 쉽게 관리할 수 있는 앱입니다. 주요 기능 - 급여 계산 - 일정 관리 - 캘린apps.apple.com 앱 소개 및 나의 역할 위 섹션에서 볼 수 있듯 모업은 모이면 업이 된다 라는 슬로건을 가지는 앱이다. 알바생이 근무 시간, 날짜, 월급을 입력하고 근무를 등록하..
[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..