SwiftUI 56

[Swift] Timer + RunLoop, backgroundQueue (swift-corelibs-foundation)

[Swift] Timer + RunLoop, backgroundQueue (swift-corelibs-foundation) 서비스 및 기능에 따라서 RunLoop.main에서 돌아가게 하면 안되는 케이스도 존재. 잘못 설계할 경우 Timer기반으로 동작하는 로그나 기능 등 예상치 못한 결과를 낼 수 있음. RunLoop.main에서 타이머가 아예 방출되지 않거나 RunLoop.main이 아닌 다른스레드에서 돌려야 하는 경우에 대하서 자세히 알아볼 예정 위 케이스들을 내부 구현 코드를 통해 근거 있게 정리해보고자 함. 글의순서 타이머 알아보기 swift-corelibs-foundation내에 Timer 구현 알아보기 Timer 선언부 Timer scheduledTimer 함수 RunLoop 간단히 알아보..

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환)

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환) 최근에는 SwiftUI와 UIKit을 정말 많이 혼용해서 사용하고 있음.특히 몇몇 컴포넌트들은 SwiftUI로 작성한 것들을 UIKit에서 가져다가 사용하는 컴포넌트들이 많은데, 서로 손쉽게 사용할 수 있도록 설계.  글의 순서구현 결과 스크린샷구현 예시 코드SwiftUI UsageUIKit Usage 구현 결과 스크린샷  구현 예시 코드구현 포인트 @State, @Binding을 외부에 직접 노출시키는 것이 아닌 Delegate를 통해 이벤트를 전달함.장점: UIKit에서 공통된 코드 규칙으로 편리하게 사용할 수 있음.  import SwiftUI/// 리스트에서 사용하는 검색 필드struct Search..

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기  글의 순서상황어떻게 처리할까?코드 적용 예시마무리 상황홈 화면에서 프로필 리스트가 있는 네비게이션 방식으로 화면을 전환하고, 해당 화면에서 프로필을 전환하고 pop 혹은 dismiss로 홈 화면으로 돌아왔을 때, 프로필이 전환되어야 함. 즉, 하위 뷰가 상위 뷰로 프로필이 전환되었음(이벤트)을 알려야 함. 어떻게 처리할까?우선 UIKit에서라면 여러가지 방법이 있겠지만, 단순하게는 Delegate Pattern이 있음.SwiftUI에서는 Environment, preferenceKey를 활용할 수 있고, @State, @Binding을 활용해 하위 뷰와 연결할 수도 있음. SwiftUI에서 제안된 방법들은 사용..

Coordinator 모듈을 통해 UI 모듈간 순환참조 해결하기

Coordinator 모듈을 통해 UI 모듈간 순환참조 해결하기  모듈을 분리하면서 화면 이동에 대한 처리가 필요해짐.기존 구조에서`UI` 모듈끼리 서로의 UI 및 기능이 필요한 경우 모듈간 순환참조가 발생할 수도 있음. 글의 순서완성한 동작 영상문제 상황아이디어 스케치Coordinator 모듈 설계하기UI 모듈 영역 적용 및 사용App 모듈 영역 적용 및 사용PresentationView 자세히보기NavigationDestinationView 자세히보기   완성한 동작 영상 영상 재현경로 설명HomeUI (모듈)[present] MultiProfileUI (모듈)[navigation] > ProfileEditUI (모듈)3개의 모듈이 화면전환이 정상적으로 동작함.   문제 상황예를 들어 홈 > 통합검..

SwiftUI 화면 dismiss 상황에서 흰 화면 나타나는 문제

SwiftUI 화면 dismiss 상황에서 흰 화면 나타나는 문제 SwiftUI 기반의 코드에서 화면 dismiss 상황에서 흰 화면이 나타나는 문제가 발생하여 그 과정을 기록 글의 순서해당 현상에 대한 영상프로젝트에서 사용한 화면 전환 방식해당 현상이 발생했을 때 흰화면이 나타나는 원인 분석어떻게 해결하는게 좋을까?현재 상황에서 해당 문제가 왜 발생할까?어떤 방식을 선택하는게 좋을까?향후 생각할 포인트.  해당 현상에 대한 영상문제 현상 재현을 위해서 내부 컨텐츠를 제거하고 화면전환.해당 현상 재현 플로우홈 > 멀티 프로필 > 프로필 생성 > 프로필 생성 닫기 > 멀티 프로필 닫기 > 홈홈 멀티 프로필 간에는 문제가 되는 코드로 작성멀티 프로필 프로필 생성 간에는 문제가 없는 코드로 작성 프로젝트에..

Swift Concurrency를 적용하면서 발생한 동시성 문제

Swift Concurrency를 적용하면서 발생한 동시성 문제사내에서도 동일한 이슈가 발생했었어서 해당 부분에 대해서 정리하고자 함.기존 Combine으로 작성된 코드를 async-await으로 교체하는 작업을 진행.  글의 순서Combine으로 작성된 코드 살펴보기Swift Concurrency로 단계적으로 전환하기Swift Concurrency로 안전성 확보하기Combine에서 Swift Concurrency 적용 Combine으로 작성된 코드 살펴보기기존 코드는 캐싱을 위해 캐시 프로퍼티가 존재하며, Combine을 기반으로 작성되어 있었음.Combine을 선택한 이유는 RxSwift가 익숙하여, RxSwift와 닮은 애플 퍼스트파티 선택에서 Combine을 선택   Swift Concurre..

UseCase와 Repository 테스트 목적 정리

UseCase와 Repository 테스트 목적 정리 해당 형태의 구조의 프로젝트에서 테스트코드를 작성하면서 학습하고 느낀점들을 정리. 글의 순서UseCase 테스트 목적Repository 테스트 목적Repository 테스트 하기SearchSubwayUseCaseTests 실패 후 로직 보완 안드로이드 공식 앱 아키텍처 가이드를 확인하면서 UseCase 영역에 해당하는 Domain이 Optional로 되어 있음을 확인할 수 있었음.개인 경험에 의하면 실제로 UseCase에서 특별한 처리 없이 사실상 래핑에만 해당하는 경우도 많긴 함. 일반적인 상황에서는 Domain Optional 이어도 나쁘지 않겠지만, 기능이 하나 둘 추가되면서 Repository가 두꺼워지고 결국은 UseCase를 분리하는 과정에..

Library vs Framework 정리

Library vs Framework 정리 모듈화의 개념을 이해하기 전 기초 지식으로 정리. Library란?개발자가 만들 클래스들의 집합으로 다른  프로그램에서 사용할 수 있도록 제공Framework란?소프트웨어를 개발하는데 있어서 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 묶음이나 뼈대(틀)을 라이브러리 형태로 제공되는 것.제어의 역전 개념이 적용된 대표적 기술 Library와 framework의 차이라이브러리와 프레임워크의 차이는 제어 흐름의 주도성이 누구 / 어디에게 있는가가 포인트즉, 애플리케이션의 흐름(Flow)를 누가 갖고 있느냐의 차이프레임워크는 스스로 제어 흐름의 주도성을 갖는 반면, 라이브러리는 개발자가 가짐.  StaticLibrary / Dynamic Libarary ..

Swift @TaskLocal

Swift @TaskLocal- TaskLocal 값은 Task의 컨텍스트 내에서 바인딩되고 읽을 수 있는 값- Task와 함께 암묵적으로 전달되며, TaskGroup이나 `async let`으로 생성된 하위 Task에서도 접근할 수 있음     TaskLocal 선언하기enum Example { @TaskLocal static let traceID: TraceID?}// Global task local properties are supported since Swift 6.0:@TaskLocalvar contextualNumber: Int = 12 Swift 6.0부터 global로 사용 가능함.global에 대해서 더 자세히 알고 싶다면 댓글(간략정리) 혹은 아래 포스팅 참고.https://..