안녕하세요, iOS 개발하는 루피입니다. 오늘은 인터페이스를 관리하고, 앱의 콘텐츠 간 네비게이션을 구현하는 데 필요한 View Controller에 대해 정리해 보도록 하겠습니다. 바로 시작합니다. ( 편의상 ViewController를 VC라고 하겠습니다. )View Controller란?VC는 UIKit 앱의 인터페이스를 관리하는 핵심 요소입니다. 모든 iOS 앱은 최소 하나 이상의 VC를 가지고 있으며, 이는 앱의 메인 윈도우를 채우는 역할을 하죠! 간단히 말하자면, VC가 하는 일은 다음과 같습니다.앱 UI의 특정 부분, 즉 View를 관리합니다.해당 UI와 데이터 간의 상호작용을 담당합니다.앱 내에서 서로 다른 UI 간의 전환 처리를 담당합니다. (네비게이션은 이에 해당하겠죠?)각 VC는 하나..
ios
안녕하세요, 루피입니다. 오늘은 캡스톤 작품인, 효도르 프로젝트를 진행하면서, 직접 구현했던 ImageCache를 KingFisher로 변경한 내용에 대해 글을 적어보려합니다. 바로 시작합니다.1. 왜 ImageCahe가 필요했는가?현재 Hyodor 앱은 가족 공유 앨범이라는 기능이 있습니다. 서버에서 이미지 URL 목록을 받아와 화면에 효율적으로 뿌려줘야 했기 때문에 캐시 구현이 필수로 요구 되었습니다. 캐시가 필요했던 가장 큰 이유는 한번 받아온 이미지 URL을 사용할때, 반복해서 서버에 API 호출하는 것이 아닌 메모리에 캐싱해 빠르게 접근해서 사용하기 위해서였습니다.2. 왜 직접 구현을 먼저 했는가?이거는 제가 생각하는 고집이자 공부의 방향성이긴 한데요. 저는 학습을 하는 과정에서는 제가 생각하는..
안녕하세요, 루피입니다. 오늘은 클로저를 공부하다 알게된 @autoclosure에 대해 정리 해보려합니다. @autoclosure에 대해 단순히 { } 를 생략하게 해주는 코드를 깔끔하게 만들어주는 Syntax Sugar로만 알고 계신분들도 많을텐데요. 이번시간에는 @autoclosure의 진짜 강력함인 실행 지연에 대해 좀 더 집중하도록 하겠습니다. 바로 시작합니다.문제의 시작: "굳이 지금 계산해야 할까?"@autoclosure를 이해하려면 먼저 이것이 해결하려는 문제를 알아야 합니다. 다음은 간단한 로그를 출력하는 함수입니다.// 조건이 참일 때만 메시지를 출력하는 함수func logIfTrue(_ condition: Bool, _ message: String) { if condition { ..
안녕하세요, 루피입니다. 오늘은 값과 참조에 관해 정리해보는 시간을 가져보려합니다. 가장 기본적인 내용이지만, 가장 중요한 개념이기에 이번 기회에 제대로 짚고 넘어가면 좋을거 같습니다. 바로 시작합니다.값 타입 vs 참조 타입값 타입은 데이터를 전달할 때 값을 복사 해서 전달합니다.예를 들어, 구조체 인스턴스를 다른 변수에 할당하면, 전혀 별개의 인스턴스가 생성되어 원본과는 완전히 독립적으로 작동하게 됩니다.참조 타입은 값을 전달하는 것이 아니라 그 값이 저장되어 있는 메모리 주소 를 전달합니다. 그래서 클래스 인스턴스를 다른 변수에 할당하더라도 실제로는 같은 객체를 가리키게 됩니다. 즉, 둘 중 하나에서 값을 바꾸면 나머지에도 영향을 끼치게 되는 것이죠.Swift 의 타입Swift에서 모든 타입은 크게..
안녕하세요, 루피입니다. 이번 포스팅은 Parallelization 2번째 시간입니다. 오늘은 Swift의 내장 동시성 시스템을 활용하여 데이터 변환 작업을 효율적으로 수행하는 방법에 대해 알아보겠습니다. 특히 비동기 및 병렬 처리와 결합하는 방법에 대해 정리 해보려합니다. 바로 시작합니다.왜 비동기 컬렉션 처리가 필요한가?우리가 일상적으로 작성하는 코드의 대부분은 본질적으로 일련의 데이터 변환으로 구성됩니다. 네트워크 응답, 사용자 입력, 데이터베이스 쿼리 등 다양한 형태의 데이터를 받아서 로직을 실행하고, 최종적으로 저장하거나 사용자에게 표시하는 과정이죠.하지만 기존의 동기적 처리 방식은 성능상 한계가 있습니다.// 기존 동기 처리 - 순차적 실행class FavoritesManager { fu..
안녕하세요, 루피입니다.이번 포스팅은 지난 Task에 대한 포스팅을 마무리하고 새롭게 시작하는 Parallelization을 정리하려합니다. 벙렬 작업은 주로 컬렉션 내에서 이루어지기에 제목을 위와 같이 만들었습니다. 바로 시작합니다.Swift의 동시성 시스템을 사용하여 여러 작업을 병렬로 실행하기Swift의 내장 동시성 시스템의 이점 중 하나는 여러 비동기 작업을 병렬로 수행하는 것을 훨씬 쉽게 만들어준다는 것입니다. 이는 별도의 부분으로 나눌 수 있는 작업의 속도를 크게 향상시킬 수 있습니다.이 글에서는 이를 수행하는 몇 가지 다른 방법과 각 기법이 특히 유용한 경우를 살펴보겠습니다.동시성(Concurrency) vs 비동기(Parallelism)우선 동시성과 비동기의 차이를 먼저 확인하고 넘어가겠..
안녕하세요, 루피입니다.이번 포스팅은 Swift Concurrency 3번째 시간입니다. 오늘은 Task를 이용한 메모리관리에 대한 정리를 해보겠습니다. 바로 시작합니다.async/await 사용 시 메모리 관리앱의 메모리를 관리하는 것은 비동기 코드의 맥락에서 특히 까다로운 일입니다. 다양한 객체와 값들이 비동기 호출을 수행하고 처리하기 위해 시간에 걸쳐 캡처되고 유지되어야 하기 때문입니다. Swift의 비교적 새로운 async/await 구문은 많은 종류의 비동기 작업을 더 쉽게 작성할 수 있게 해주지만, 이러한 비동기 코드에 관련된 다양한 작업과 객체들의 메모리를 관리할 때는 여전히 상당히 주의해야 합니다.암시적 캡처async/await의 흥미로운 측면 중 하나는 비동기 코드가 실행되는 동안 객체와..
안녕하세요, 루피입니다.이번 포스팅은 Swift Concurrency 2번째 시간입니다. 오늘은 Task의 지연 실행에 대해 깊이 있게 다뤄보겠습니다. 바로 시작합니다.왜 Task 지연이 필요할까?다음과 같은 상황에서 지연 실행이 필요합니다.검색 디바운싱: 사용자가 타이핑을 멈춘 후 0.3초 뒤 검색 실행로딩 스피너 지연 표시: 빠른 작업 시 UI 깜빡임 방지툴팁 표시 지연: 사용자가 버튼 위에 1초간 머물 때만 표시네트워크 재시도: 실패 후 일정 시간 대기 후 재시도이런 패턴들은 사용자 경험을 크게 개선하며, 팀 협업 환경에서 일관된 UX를 제공하는데 중요한 역할을 합니다.Task 지연 시키기대부분의 경우, 우리는 다양한 비동기 작업들이 생성된 후 가능한 빨리 시작되기를 원하지만, 때로는 실행에 약간의..
안녕하세요, 루피입니다!! 오늘은 제가 SwiftUI로 개발한 Hyodor 앱에서 공유 앨범의 이미지 로딩 성능을 개선하기 위해 이미지 캐싱을 활용한 경험을 공유하려 합니다. 특히, 반복적인 API 호출로 인한 로딩 지연 문제를 해결하기 위해 ImageCache를 구현하고 트러블슈팅한 과정을 중심으로 포스팅해 보겠습니다.문제 상황: 반복적인 API 호출과 로딩 지연Hyodor 앱의 핵심 기능 중 하나는 공유 앨범입니다. 사용자가 공유 앨범 뷰에서 사진을 볼 때, 각 사진의 이미지를 서버에서 가져오기 위해 API를 호출합니다. 하지만 동일한 이미지에 대해 매번 네트워크 요청을 보내다 보니 다음과 같은 문제가 발생했습니다:로딩 시간 증가: 네트워크 요청과 데이터 다운로드로 인해 이미지 표시가 느려짐.데이터..
안녕하세요, 루피입니다!! 오늘은 제가 SwiftUI로 개발한 Hyodor 앱에서 공유 앨범 데이터 로딩 문제를 해결한 경험을 공유하려 합니다. 특히, 앱 실행 시 서버에서 데이터를 가져오는 동안 UX를 개선하기 위해 Splash View 를 활용한 과정에 대해 포스팅해보려합니다.문제 상황: 데이터 로딩과 UX의 충돌Hyodor 앱의 핵심 기능 중 하나는 공유 앨범입니다. 사용자가 HomeView에서 공유 앨범 뷰로 진입하면 서버에서 공유된 사진 데이터를 가져오는 API를 호출합니다. 이 과정은 필수적이지만, 네트워크 요청과 데이터 파싱에 시간이 걸리면서 사용자에게 대기 시간이라는 불편함을 줄 것이라는 생각을 했습니다.이미 로드한 사진은 ImageCache을 통해 빠르게 표시했지만, 앱을 처음 실행할 때..