[Swift] Concurrency - Task(2)
·
iOS/Swift
안녕하세요, 루피입니다.이번 포스팅은 Swift Concurrency 2번째 시간입니다. 오늘은 Task의 지연 실행에 대해 깊이 있게 다뤄보겠습니다. 바로 시작합니다.왜 Task 지연이 필요할까?다음과 같은 상황에서 지연 실행이 필요합니다.검색 디바운싱: 사용자가 타이핑을 멈춘 후 0.3초 뒤 검색 실행로딩 스피너 지연 표시: 빠른 작업 시 UI 깜빡임 방지툴팁 표시 지연: 사용자가 버튼 위에 1초간 머물 때만 표시네트워크 재시도: 실패 후 일정 시간 대기 후 재시도이런 패턴들은 사용자 경험을 크게 개선하며, 팀 협업 환경에서 일관된 UX를 제공하는데 중요한 역할을 합니다.Task 지연 시키기대부분의 경우, 우리는 다양한 비동기 작업들이 생성된 후 가능한 빨리 시작되기를 원하지만, 때로는 실행에 약간의..
[Swift] Concurrency - Task(1)
·
iOS/Swift
안녕하세요, 루피입니다.이번 포스팅부터 Swift Concurrency에 대해 학습해보려 하는데요, 이전에 한번 정리한 적이 있지만, 좀 더 체계적인 방법으로 정리해보고자 합니다.Swift 5.5부터 도입된 Swift의 내장된 Concurrency 시스템은 가볍지만 효율적인 동시성 코드를 작성할 수 있도록 도와줍니다.기존 GCD와 OperationQueue의 복잡성을 해결하고, 더 안전하고 직관적인 비동기 프로그래밍을 가능하게 합니다.기존 방식의 한계점기존 GCD 방식에서는 다음과 같은 복잡성이 있었습니다.// 기존 GCD 방식의 문제점DispatchQueue.global().async { let data = self.fetchData() DispatchQueue.main.async { [we..
[SwiftUI] some View
·
iOS/SwiftUI
안녕하세요, iOS 개발하는 루피입니다. 오늘은 SwiftUI View와 Modifiers에 대해 공부하면서 궁금했던 some View, 특히 some 키워드에 대해 좀 더 자세히 알아보겠습니다. 바로 시작합니다.1. some View를 왜 써야 하는가?지난 글에서 "some View는 View 프로토콜을 준수하는 어떤 객체이지만, 정확히 어떤 타입인지는 말하고 싶지 않다"라고 간략하게 설명했는데요. 그래 편하겠지... 근데 뭐가 어떻게 편한거야? 그리고 왜 써야하는지 잘 와 닿지가 않더라고여... 그래서 이 부분에 대해 더 자세히 살펴보겠습니다.1) 편리성과 코드 가독성만약 우리가 some View를 사용하지 못한다면 어떻게 될까요?만약 Text를 반환하고 싶다면... struct ContentView..
[트러블 슈팅] SwiftUI에서 느린 사진 업로드 문제 해결
·
트러블 슈팅
안녕하세요, iOS 개발하는 루피입니다. 오늘은 최근 SwiftUI를 기반으로 컴퓨터종합설계 프로젝트를 진행 중인데, 느린 사진 업로드 문제를 해결했던 트러블 슈팅 경험을 정리해보려 합니다. 바로 시작합니다.1. 문제 발생 배경최근 SwiftUI 기반 사진 공유 앱의 사진 업로드 기능에 성능 문제가 발생했습니다. 사용자가 사진첩에서 사진을 선택해 S3 버킷에 업로드하는 기능이었는데, 10장의 사진을 업로드하는 데 12초 이상 걸렸습니다. 이렇게 될 경우 사용성이 많이 떨어질 것으로 판단하여, 기능 개선을 위해 노력했습니다. 느린 업로드 문제를 진단하고, 최적화 과정을 통해 업로드 시간을 단축한 트러블슈팅 과정을 공유합니다.2. 문제 상황 : 느린 사진 업로드앱의 PhotoListViewModel은 사용..
[SwiftUI] StateObject
·
iOS/SwiftUI
안녕하세요, iOS 개발하는 루피입니다! 오늘은 공식문서를 바탕으로 StateObject에 대해 정리해 보는 시간을 가져보려 합니다. 바로 시작합니다.StateObject란?StateObject는 SwiftUI에서 참조 타입 객체를 관리하기 위한 프로퍼티 래퍼로, iOS 14부터 도입되었습니다.(iOS 17 이후부터는 참조 타입도 @Observable 매크로와 함께 @State로 관리하는 것을 Apple이 권장하고 있습니다.) ObservableObject 프로토콜을 준수하는 참조 타입 객체의 생명주기를 관리하고, 뷰가 업데이트될 때도 객체의 상태를 안정적으로 유지하는 역할을 합니다.@MainActor @frozen @propertyWrapper @preconcurrencystruct StateObjec..
[SwiftUI] Bindable
·
iOS/SwiftUI
안녕하세요, iOS 개발하는 루피입니다. 오늘은 공식문서를 바탕으로 Bindable에 대해 정리해보는 시간을 갖겠습니다. 바로 시작합니다.Bindable이란?@Bindable은 Observable 객체의 변경 가능한 속성들에 바인딩을 생성할 수 있게 해주는 프로퍼티 래퍼입니다.이 프로퍼티 래퍼를 사용하면 Observable 프로토콜을 준수하는 데이터 모델 객체의 변경 가능한 속성에 바인딩을 만들 수 있습니다. 예를 들어, 아래 코드에서는 @Bindable로 book 입력을 감싸고 있습니다. 그런 다음 TextField를 사용해 책의 title 속성을 변경하고, Toggle을 사용해 isAvailable 속성을 변경합니다. 이때 $ 문법을 사용하여 각 속성에 대한 바인딩을 컨트롤에 전달합니다.@Observ..
[SwiftUI] 상태 관리 - PropertyWrapper (2)
·
iOS/SwiftUI
안녕하세요, iOS 개발하는 루피입니다!이전 글에서 SwiftUI의 상태 관리 기본 개념과 특징에 대해 알아보았습니다. 이번 글에서는 상태를 하위 뷰와 공유하는 방법, Observable 객체와의 활용, 그리고 성능 최적화와 일반적인 실수에 대해 알아보겠습니다.바로 시작합니다.하위 뷰와 상태 공유하기 (Share state with subviews)상태 프로퍼티를 하위 뷰로 전달하면, 상위 뷰에서 해당 값이 변경될 때마다 SwiftUI는 하위 뷰를 자동으로 업데이트합니다. 하지만 하위 뷰는 이 값을 수정할 수 없습니다. 하위 뷰가 상태 값을 수정할 수 있게 하려면, 상태 대신 바인딩을 전달해야 합니다. 예를 들어, PlayButton에서 isPlaying 상태를 제거하고, 대신 바인딩을 받도록 변경할 수..
[SwiftUI] 상태 관리 - PropertyWrapper (1)
·
iOS/SwiftUI
안녕하세요, iOS 개발하는 루피입니다! 오늘은 SwiftUI의 선언적 UI 패러다임의 핵심인 상태 관리에 대해 알아보겠습니다. 특히 가장 기본이 되는 State 프로퍼티 래퍼를 중심으로 공식 문서를 바탕으로 정리해보았습니다. 바로 시작합니다.@State란 무엇인가?@State는 SwiftUI에서 제공하는 Property Wrapper 타입의 하나로, 변수 앞에 위치하며 해당 프로퍼티 데이터 값에 접근할 수 있고 또한 최신 값을 반영합니다. 이름 그대로 상태(State) 자체를 나타내며, 상태가 변하면 UI도 이에 맞게 변합니다.struct ContentView: View { @State private var name = "World" var body: some View { VSt..