본문 바로가기

분류 전체보기98

비동기 작업 cancel 꼬꼬무해보기 (with LLDB 디버깅) 오늘은 ViewModel 등에서 Swift Concurrency Task의 라이프 사이클을 관리하면서 겪은 트러블 슈팅, 그리고 그 과정에서 공부한 내용을 정리해보려고 한다. Combine, Rxswift 두 반응형 프레임워크는 이벤트 스트림을 비동기적으로 처리할 수 있도록 해준다.그리고 일반적으로 ViewModel등에서 스트림 이벤트를 처리할때 ViewModel의 메모리에서 해제되는 시점에 스트림을 즉 작업을 취소(cancel)할 수 있게, 이벤트(또는 작업)들을 보관하고 관리할 수 있는 disposeBag 또는 cancellableBag 을 만들어 사용한다. 그렇다면 Swift Concurrency의 Task는 어떨까?Swift 공식문서를 보면 Task 또한 취소가 가능하게 cancel을 제공한다고 .. 2024. 10. 5.
[UIKit] UIScreen 사용을 지양해야하는 이유 (feat. Scene 관점에서) 보호되어 있는 글 입니다. 2024. 8. 25.
[Swift] actor도 final 키워드로 최적화 할 수 있을까? 흔히들 class에서 상속 구조가 없으면 swift optimizationTips에서 가이드하는 것처럼 아래와 같이 final 키워드를 명시하여 컴파일러가 최적화를 수행할 수 있도록 해준다. class 뿐만 아니라 메서드, 프로퍼티는 final 키워드를 통해 컴파일러가 최적화가 가능하다.final 키워드는 더 이상 얘는 overriden 되지않아.! 걍 바로 얘 쓰면 돼! 라고 알려주는 것과 같기 때문이다. 그렇다면 swift 5.5에 새롭게 등장한 actor는 어떨까? 그보다 먼저 actor가 뭔지부터 간략하게 끄적여보면actor는 class와 같은 reference type이다. class와 다른 점은 상속이 불가능하고, MT-safe를 기본적으로 보장한다.다른 타입처럼 initializer도 가질 .. 2024. 8. 24.
[Combine] Future : Convenience Publishers Combine의 Future Publisher에 대해 정리.Future와 Promise란 무엇인가? Future는 아직 존재하지 않을 수 있는 값을 위한 컨텍스트. 일반적으로, 우리는 비동기 작업의 최종적인 완료 또는 실패를 나타내기 위해 Future를 사용함. Swift는 Combine 프레임워크의 일부로서 Future의 기본 구현을 제공함. Future는 자신이 감싸고 있는 값의 타입과 발생할 수 있는 오류의 타입을 나타내는 두 가지 타입을 가짐.위 코드 조각에서는 각각 Int(값의 타입)와 Never(오류의 타입)가 해당됨.  Combine의 영역에서 Future는 하나의 Publisher임.Future는 Publisher 프로토콜을 채택함. Publisher 프로토콜의 모든 요구사항을 따르며, P.. 2024. 8. 19.
[SwiftUI] 링크도 게으름이 필요해: NavigationLink를 Lazy하게 안녕하세요. 로디입니다. SwiftUI로 앱을 개발하다 보면 자연스럽게 만나게 되는 친구가 있죠. 바로 NavigationLink입니다.오늘은 NavigationLink에서 메모리 사용을 최적화하는 기법에 대해 알아보려고 합니다. 뷰 간의 네비게이션을 손쉽게 처리해주는 NavigationLink 요녀석, 처음엔 아주 사랑스러운데, 쓰다 보면 뭔가 불편함을 느낄 때가 있습니다.  기본적으로 NavigationLink는 화면에 나타나는 순간, 링크의 목적지(destination)를 미리 생성해버립니다. 작은 화면이나 간단한 뷰라면 상관없지만, 복잡한 화면이거나 무거운 데이터를 다루는 경우라면 이야기가 달라집니다. 무거운 뷰를 미리 생성해둔다..? 메모리 폭행범인가요?..🥲 아직 쓰지도 않는 뷰의 메모리를 .. 2024. 8. 18.
[WWDC21] Meet async/await in Swift WWDC21 : Meet async/await in Swift 세션을 그대로 번역한 내용입니다. Swift는 이제 비동기 함수를 지원합니다. 이 패턴은 흔히 async/await로 알려져 있습니다. 새로운 문법이 어떻게 코드를 더 읽기 쉽고 이해하기 쉽게 만들어주는지 알아보세요. 함수가 일시 중단(suspend)될 때 무엇이 일어나는지, 그리고 기존의 완료 핸들러(completion handler)를 비동기 함수로 어떻게 변환할 수 있는지도 배워보세요. 안녕하세요, 저는 Apple의 Swift 팀 엔지니어 Nate입니다. 오늘 제 동료 Robert와 함께 Swift의 async/await에 대해 설명드리겠습니다.비동기 프로그래밍은 여러분 중 많은 분들이 정기적으로 수행하는 작업일 것입니다. 비동기 코드는.. 2024. 8. 17.
[WWDC21] What’s new in SwiftUI 1. pull to refresh2. searchable [SearchBar]3. list row separator4. async image5. material effect6. badge for TabView item7. onSumit Trigger8. safeArea inset9. iteractiveDismissDisabled10. swipe actions11. AppStorage raw representable12. keyboard done button13. Canvas Core Graphics14. keyboard accessory view15. FocusState 2024. 8. 11.
[WWDC20] What’s new in SwiftUI 1. Grid View/ Collection View2. ScrollView API Update Scroll To Bottom3. PageView Controller4. Full Screen modal5. MultiLine TextField [Text Editor]6. Progress View and Activity Indicator7. Link8. LazyVStack and LazyHStack 9. Disclosure Group or Drop Down10. Advanced Map View and Map View annotations11. TextField onChange [SearchBar] 2024. 8. 11.
[Swift] Call to main actor-isolated instance method in a synchronous nonisolated context Swift 6에서는 Swift Concurrency 모델을 강화하여, MainActor에 의해 격리된 인스턴스 메서드를 비격리 Context에서 호출할 수 없음.Swift의 Concurrency 모델에서 "격리"는 영어로 "isolation"이라고 합니다. Swift에서는 데이터 race를 방지하고 안전한 동시성 프로그래밍을 가능하게 하기 위해 "actor-isolated"라는 개념을 도입했습니다. "actor-isolated"는 특정 액터(Actor) 또는 메인 액터(MainActor)에 의해 격리된다는 의미입니다. 이 격리는 액터가 자신이 소유한 상태(state)에 대한 접근을 제어하도록 합니다. 이 문제를 해결하려면 아래와 같이 @MainActor 속성을 사용하여 함수나 메서드를 MainActor에.. 2024. 8. 4.
[Swift] 데이터모델링 Struct와 Class중 어떤 걸 써야할까요 +_+ ? 안녕하세요 로디입니다 🙂 오늘 커뮤니티에서 어떤 분이 Struct와 Class중에 데이터 모델을 어떤 타입으로 정의해야하는지,어떤 케이스에 따라 타입을 구분해서 사용하는지 물으시더라구요.Struct는 값 타입이구, Class는 참조 타입이기 때문에 참조 값을 공유할 필요가 없으면 Struct를 쓰는걸 권장함.! 이라고 말씀드리니그러면 Class로 모델을 정의하는 경우가 보통 언제 있는지 설명해달라고 하시는데,,, 어라라 +_+ 설명하려니깐 명확하게 구분지어 말씀을 못드리겠더라구요. 저도 헤매던 찰나에 다른 분이 공식문서 링크를 따악 공유해주셔서 저도 오늘 문서에서 적힌 내용을 정리해보려고 합니다.그러면 비교 하러가볼까요 ~~? (공식문서는 여기에서 확인할 수 있습니다!) 🤔  Struct와 Class.. 2024. 8. 4.
[PhotoKit] 3. Asset Retrieval Fetching Objects and Requesting Changes: PhotoKit을 사용하여 Photos 앱의 객체를 가져오고 변경 요청을 하는 방법. PhotoKit에서 Photos 앱의 객체들은 모두 PHObject타입임. 이미지, 비디오, 라이브 포토와 같은 에셋 (PHAsset),앨범이나 순간 모음과 같은 에셋 컬렉션 (PHAssetCollection),앨범 폴더 또는 ~한 순간 모음의 모음과 같은 컬렉션 리스트 (PHCollectionList)PHAsset, PHAssetCollection, PHCollectionList는 읽기 전용이며 변경할 수 없으며 메타데이터만 포함. 이 클래스들을 사용하여 지정된 쿼리와 일치하는 객체(PHObject)를 가져옴(fetch). 변경을 하기 위해서는 .. 2024. 8. 3.
[PhotoKit] 1. PHPhotoLibrary : Shared Photo Library PHPhotoLibraryPHPhotoLibrary는 사용자의 사진 라이브러리에 대한 접근과 변경을 관리하는 객체. PHPhotoLibrary 객체는 Photos앱이 관리하는 전체 Asset 및 Collection을 나타냄. (로컬 장치에 저장된 Asset과 iCloud Photos에 저장된 Asset 포함) 이 PhotoKit의 PhotoLibrary 즉, PHPhotoLibrary의 객체는 어쩔때 쓰냐면,사용자가 우리 앱에 부여한 Photos 콘텐츠에 대한 액세스 권한(permission)을 검색 또는 확인할때asset들과 collection들을 변경하고자 할때. 예) 에셋 메타데이터나 콘텐츠 변경, 새로운 에셋 추가, 컬렉션 멤버 재정렬사진 라이브러리 변경사항에 대한 이벤트 감지하고 싶을 경우 1... 2024. 8. 3.