목록분류 전체보기 (23)
cchanmi
최근 UIKit 프로젝트에 SwiftUI를 도입하게 되면서 접하게 된 Propery Wrapper에 대해 정리해 보려고 합니다. @StateA property wrapper type that can read and write a value managed by SwiftUI. SwiftUI가 관리하는 값을 읽고 쓸 수 있는 property wrapper입니다. @State는 View에서 초기값을 생성해야 하고, 다른 객체로부터 상태를 수정하는 것을 방지하기 위해 private으로 선언하는 것을 권장합니다.값이 변경되면 변화를 감지하고, UI를 자동으로 다시 그리도록 합니다.데이터를 전달할 때는 Binding를 통해 @State 프로퍼티를 전달할 수 있습니다.struct PlayButton: View { ..
저는 Github Action을 도입하면서 각종 에러에 대해 4일 가량의 시간이 걸렸었는데요.생각보다 Github Action 도입 관련 블로그에 에러를 해결했다는 내용들은 정리가 되어 있지 않아서 과정+오류 해결 내용도 같이 정리해 보려고 합니다. 일단 저희 프로젝트에 적용할 CI는 빌드와 테스트 코드 자동화였습니다.처음 명령어를 입력했을 때는 code 74 error가 발생했습니다. code 74 error xcodebuild 버전과 현재 프로젝트 xcode 버전이 맞지 않는 문제이때 당시에 xcode 버전을 16으로 올렸었는데, 그로인해 프로젝트 포멧 버전이 70으로 올라갔었습니다.제가 올린 xcode 버전과 xcodebuild의 버전과 호환이 되지 않는 문제였습니다.GithubAction에서는 ..
Smeem 프로젝트를 1년 6개월 동안 진행하면서 반복적인 빌드, 테스트 코드 후 통과 과정, 배포에 많은 시간이 소요됨을 느꼈습니다.이러한 반복적인 과정들을 통해 불편함을 겪었고 해당 내용들을 자동화하면 어떨까?라는 생각이 들어서 Github Action을 통해 CI/CD를 이번 포스팅에서는 빌드와 테스트 코드 통과 과정을 자동화하는 내용을 작성하려고 합니다. 목표는 develop 브랜치로 push 하면 build와 테스트를 실행시키는 것이었습니다. 그렇다면 원하는 명령어의 workflow를 작성해 주어야 하는데... yml 문법은 들여쓰기가 문법이기 때문에 이를 유의하여 작성해 주어야 합니다. # This workflow will build a Swift project# For more inform..
RxSwift는 비동기 작업 코드를 쉽게 관리할 수 있게 도와주는 라이브러리입니다. 그로인해 코드의 가독성이 높아지고, 다양하고 편리한 Operator를 활용하여 효율적인 비동기 처리가 가능해집니다. 그런데 이러한 RxSwift에는 큰 단점이 있는데, 잘못된 사용으로인한 메모리 누수가 발생할 수 있다는 것입니다.오늘은 RxSwift에서 어떤 경우에 메모리 누수가 발생하는지, 해당 문제를 해결하기 위해서는 어떻게 해야 하는지에 대해 정리해 보겠습니다. weak self가장 기본적인 방법입니다. button.rx.tap .subscribe(onNext: { [weak self] text in guard let self = self else { return } self?.mapCoun..
ViewModel로부터 관찰한 데이터를 sink 클로저 안에서 CollectionView에 바인딩을 해야 했습니다.output.totalHasMyPlanResult .receive(on: DispatchQueue.main) .sink { [weak self] response in print("collectionView에 바인딩 될 데이터: ", response) } .store(in: &cancelBag)MVVM 원칙에 따라 View가 Data를 알 필요가 없었기 때문에, 해당 데이터를 전역으로 추가하여 외부 CollectionViewDatasource 메서드에서 바인딩 할 수 없었던 상황이었습니다.생각나는 방안으로는 2가지가 있었습니다.1) CollectionViewD..
최근 RxSwift + ReactorKit 프로젝트를 진행했었는데요.프로젝트 후반에 접어들면서 RxSwift에 대해 제대로 이해하고 썼는가에 대한 의문이 들어서 정리하는 포스팅을 작성하게 되었습니다. RxSwift란?Reactive Extension Swift의 약자로 swift로 반응형 프로그래밍을 구현할 수 있도록 도와주는 라이브러리입니다.반응형 프로그래밍은 데이터의 스트림이나 변경 사항에 반응하여 실행되는 프로그래밍 패러다임입니다. RxSwift 사용하는 이유그렇다면 러닝커브가 높다고 소문이 자자한 RxSwift를 그렇게 많은 사람들이 사용하는 이유가 뭘까요?제가 직접 사용해 보고 느낀 장단점에 대해서 정리해 보자면 장점- 기존 @objc, delegate, closure, notification ..
최근 진행 중인 프로젝트에서 CollectionView Cell에 있는 버튼 클릭시, indexPath 값을 전달받아 해당 row의 cell을 삭제하는 로직을 구현했는데요. 중복 바인딩 문제가 발생하여서 index out of error로인해 앱이 크러쉬나는 이슈를 경험했습니다. 기존 문제가 되는 코드를 살펴보겠습니다.reactor.state.compactMap{ $0.selectedArrayImage } .bind(to: imageCollectionView.rx.items) { (collectionView, row, element) in let indexPath = IndexPath(row: row, section: 0) let cell = collectionView.de..
최근 탈퇴 사유를 수집하는 기능을 구현하다가 큰 버그를 발견하게 되어서 글을 작성하게 되었습니다.해당 뷰는 TextView 클릭시 키보드가 활성화 및 비활성화 되면서 키보드 높이 만큼 화면을 이동시켜야 했고, 탈퇴버튼 클릭시 키보드를 감지하는 notification이 중복 호출되면서 두 배 이상의 키보드 높이 크기가 이동되는 버그가 발생했습니다. break point를 찍어 보았을 때, 키보드가 사라지는 걸 감지하는 notification, 올라오는 걸 감지하는 notification가 여러 번 호출되는 것을 알 수 있었습니다. output.notEnabledButtonResult .sink { [weak self] type in self?.resignButton.changeButton..
최근 운영 중인 앱 서비스에서 스플래시에서 에러가 발생하여 앱이 멈추는 현상이 있었습니다. 해당 오류는 모든 유저한테서 공통적으로 발생하는 에러가 아니었기 때문에, 어떠한 문제로인해 발생하는 에러인지 원인을 알기가 어려웠습니다. 유저가 스플래시 뷰에서 다음 화면으로 넘어가지 못하고 앱이 멈추는 현상은 크리티컬한 현상이었기 때문에, 원인을 찾고자 팀원들과 열심히 디버깅했었던 기억이 있네요.서버 팀원들에게 토큰 재발급 API 호출시, 내려오는 error response들의 문서를 요청하고, 하나씩 검토하며 원인을 찾아갔습니다. 여러 원인 중 statusCode 401일 경우에 토큰이 만료된다는 경우를 발견하였고, 현재 상황에 대입하여 생각해 보았습니다. 스밈 프로젝트는 소셜로그인을 통해 로그인을 성공한 유..
싱글톤 패턴이란? 오직 하나의 인스턴스만 생성해서 사용하는 패턴입니다. 해당 인스턴스를 전역으로 생성하고, 여기저기서 접근하여서 사용할 수 있습니다. 실제로 싱글톤 객체는 class SingleTon { static let shared = SingleTonPattern() private init { } } 이런 식으로 static let으로 전역으로 선언합니다. 그리고 다른 곳에서는 해당 클래스를 초기화할 수 없도록 private init을 해 주고 있습니다. 그렇다면 왜 static let으로 선언해야 하는지, 싱글톤의 장점과 단점은 무엇인지에 대해 먼저 알아보도록 할게요. 싱글톤의 장점 - 한번의 인스턴스만 생성하기 때문에 메모리 낭비를 방지할 수 있음 - 전역으로 인스턴스를 공유하기 때문에 데이터 ..