본문 바로가기

전체 글

(54)
CarouselView - DragGesture -> ScrollView -> UICollectionView 현재 내 프로젝트의iOS Target Version은 16.4이며프레임워크는 SwiftUI를 사용중이다. Horizontal 방향으로 Snap을 스크롤을 넘기는CarouselView 구현을 진행했다. Target Version을 17.0으로 잡았다면17.0에 새로 나왔던 기능중 하나인 ScrollTargetBehavior를 사용하여간단하게 구혔했을 것이다.https://developer.apple.com/documentation/swiftui/scrolltargetbehavior ScrollTargetBehavior | Apple Developer DocumentationA type that defines the scroll behavior of a scrollable view.developer.appl..
SwiftUI에서 MVVM이 꼭 필요할까? - 1 진행했던 UIkit 프로젝트에서의 환경은MVVM(Input/Output, Action) + RxSwift + Clean Architecture를 적용했다.SwiftUI 프로젝트에서도 동일하게MVVM(Input/Output, Action) + Combine + Clean Architecture를 적용하면서 프로퍼티 관리에 대한 고민이 정말 많았다. UIKit을 사용했을 땐 ViewController 내에서는 Component 와 ViewModel, DisposeBag외엔 사용할 프로퍼티가 없었다.그 이유는 ViewController에서 어떤 Event가 발생한 경우 ViewModel에 Input Action을전달하여 로직이 작동하고 해당 로직을 통해 데이터의 변동이 일어날 경우 ViewController로..
메모리 사용량을 줄이기 위한 노력 - 이미지 다운샘플링 프로젝트의 특성상이미지를 많이 출력하기 때문에 View가 쌓일 수록이미지에서 사용되는 메모리의 사용량은 기하급수적으로 증가할 수밖에 없다. 구현을 진행하면서계속 용량 줄려야지, 줄여야지 하면서 계속 미뤄왔던이미지 다운샘플링 구현 방식에 대해 간단히 진행해보겠다. Apple에서 진행했던 WWDC 18 세션 중 두 세션을 참고했다.WWDC 18 iOS Memory Deep Dive 🔗WWDC 18 Image and Graphics Best Practices 🔗 1️⃣  이미지 메모리 사용량 계산메모리의 사용량은 파일 크기가 아닌 이미지의 크기로 계산이 이루어진다. 이미지의 메모리 사용량은 아래 공식으로 계산된다.Memory Usage (Bytes) = Width(pixel) × Height(pixel) ..
Memory Leak - Combine Sink, Swift Concurrency 시뮬에서 앱을 빌드해보면서 뭔가 이상했다.왜 객체의 init메서드는 호출이 되는데 deinit 메서드는 호출이 되지 않지...? 앱을 사용해보면서 트래킹한 결과메모리 Leak이 발생하고 있는 것을 확인할 수 있었다. 상황을 생각해 봤을 때 View에서 일어나는 Action이View가 Appear 되는 시점에 viewModel에 task가 되었라는 Action을 취하고.task { viewModel.action(.viewOnTask)} 구독을 통해 영화 상세 정보를 Fetch 해오게 된다.input.viewOnTask .sink { Task { [weak self] in guard let self else { return } await fetchMovieInfo() } } .store(in: &..
메모리 사용량을 줄이기 위한 노력 - Kingfisher 사용 중 일어난 일 1️⃣ 메모리가 줄어들지는 않고 쌓이기만 하는 이유내 앱은 보다시피 이미지의 사용량이 많아 기본적으로메모리의 사용량이 높다. 뒤로가기 버튼을 누른다 하더라도메모리 사용량이 줄어들기는 커녕 더 늘어났다. 늘어난 건 둘째치고 왜 화면을 나갔는데 줄어들지 않는걸까?그 이유는 바로 Kingfisher의 이미지 캐싱 기능이었다... 2️⃣ 단순하게 메모리 사용량을 줄여버린 나정말 1차원적인 생각을 해버린 나는단순하게 그러면 캐싱한 데이터를 메모리에서 지워버리면 되는 거 아닌가?라는 안일한 생각을 해버리게 되면서 뷰가 disappear 상태가 될 경우 캐싱 메모리를 비워버렸다. 뒤로가기 버튼을 눌렀더니메모리가 100MB 정도 줄었다! 하지만 예상하지 못한 결과를 가져온 것이다.Push하고 Pop하는 경우 캐시에서 ..
'LookForRealBurger' 라는 주제로 LSLP 를 진행하고 난 후 LSLP의 시작2024년 8월 14일 부터 2024년 9월 1일까지 약 19일동안현재 교육을 듣고 있는 운영기관에서 LSLP 라는 프로젝트를 진행하게 되었다.LSLP란, ‘Light Service Level Project’ 로 작은 규모의 프로젝트 라는 의미다 UIKit을 활용하여 내가 처음부터 기획과 디자인 모두 맡아서 하게된 첫 프로젝트였다게다가 백엔드 개발자와 협업을 자주 해볼 경험이 없는 나에게는백엔드 서버 API 를 활용해 볼 수 있는 아주 좋은 기회였다.물론 기획부터 어려웠다.프로젝트를 진행할 때마다 항상 어려운 것이 기획단계였다.그래도 내가 재밌어야 하기 때문에 내가 좋아하는 것을 키워드로 기획을 하게 되는데내가 좋아하는 ‘햄버거’를 주제로 아이디어를 기획하고 디자인하고 구현을 시작하게 되었..
RxSwift + TableView + MVVM + Input & Output 에서 TableViewCell 내부 disposeBag 중첩현상 📗 문제RxSwift를 공부하던 도중CustomTableViewCell을 가진 TableView를 그려보던 도중 이상한 에러가 발생한다 체크버튼을 탭 할 경우 완료 / 미완료 가 되어야하는데갑자기 두 개의 셀이 완료가 되고세 개의 셀이 미완료가 되는 것을 볼 수 있다 탭 했을 때 indexPath를 print 해보니세 개의 셀 내부 버튼을 탭했는데print는 총 6개가 찍힌 것을 볼 수 있다 그렇다,Cell 내부에 존재하는 DisposeBag 인스턴스가 재사용될 때마다중첩이 된 것이다. 그렇다면 재사용되는 타이밍에 disposeBag에 인스턴스를 새로 재할당해주면 해결이 될 것이다. 다시 빌드해봤다왜지...? 분명 disposeBag을 새로 재할당 해줬는데이상하다 싶어 print 함수를 출력해봤다. 나..
UIKit - GCD + Alert 에러 (Call must be made on main thread, Unsupported enumeration of UIWindowScene windows on non-main thread.) 📗 Call must be made on main thread 에러현재 작성된 코드guard (200.. URLSession의 dataTask 메서드를 통해 받아온 response 값의 status code 를 확인하여 에러를 가지고 있는 status code를 만나면 Alert를 뷰에 띄어준다.처음에는 기본적인 present 메서드를 호출하였고present(viewControllerToPresent: UIViewController, animated: Bool) 이 상태로 앱을 빌드한 결과아래 스크린샷으로 보여지는 에러를 만나게 됐다. 그래서 global thread에서 돌렸던 상황에서 아래 코드를 통해 main thread로 다시 thread를 main thread로 돌려놓았고 다시 빌드해 본 결과D..