일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 네이티브
- 파노라마 뷰
- SwiftUI
- completion handler
- 뷰 생명주기
- 리액트
- requirenativecomponent
- native
- 뷰 정체성
- 360도 이미지
- 360도 뷰어
- react-native-fast-image
- 360도 이미지 뷰어
- react
- ssot
- 구조적 정체성
- launch screen
- 앱 성능 개선
- launchscreen
- Android
- panorama view
- React Native
- 스켈레톤 통합
- 라이브러리 없이
- data driven construct
- @sendable
- React-Native
- 리액트 네이티브
- ios
- 명시적 정체성
- Today
- Total
목록개발지식 정리/Swift (38)
Neoself의 기술 블로그
클로저는 코드 내에서 전달되거나 사용할 수 있는 독립적인 기능 블록1급 객체이기 때문에 변수, 함수의 인자, 함수의 반환값으로 사용할 수 있습니다.*Kingfisher에서는 중복 다운로드 방지기능 구현을 위해 onCancelledCallback 클로저들을 배열에 보관한 후, 취소 요청이 발생하면, 해당 배열을 순회하며 콜백들을 사용합니다.캡처func makeAdder() -> (Int) -> Int { var base = 10 // [base]는 캡처 리스트로, base의 값을 복사하여 캡처 return { [base] num in return base + num }}func makeAdder() -> (Int) -> Int { var base = 10 ..
Swift의 동시성 모델(Concurrency Model)을 도입하여 Kingfisher의 핵심 로직을 재구현한 NeoImage 라이브러리 개발 과정을 소개합니다. 이 글에서는 특히 동시성 처리와 관련된 변경 사항에 중점을 두고 설명하겠습니다. 동시성 모델 도입 배경Swift 동시성 모델 소개WWDC 2021에서 Apple은 Swift 5.5와 함께 새로운 동시성 모델을 소개했습니다. 이 모델은 기존의 복잡한 콜백 기반 비동기 프로그래밍을 대체하는 async/await, actor, Task 등의 강력한 기능을 포함하고 있습니다: async/await: 비동기 코드를 동기 코드처럼 작성할 수 있게 해주는 문법actor: 공유 가변 상태에 대한 안전한 접근을 보장하는 참조 타입Task: 비동기 작업을 시작..

안녕하세요, 이번 글에서는 Kingfisher 라이브러리 네트워킹 레이어에서 구현된 콜백 구조를 살펴보겠습니다. 우선 Kingfisher에서는 이벤트가 발생했을 때 실행할 콜백을 등록하고, 적절한 시점에 호출될 수 있도록 Delegate 클래스를 제공하고 있습니다. 이 Delegate 클래스로 등록된 콜백들을 체이닝하여, 이벤트 전달을 비롯하여 복잡한 로직들을 처리하고 있습니다.그럼, Kingfisher는 왜 콜백을 여러 파일에 걸쳐 전달 및 호출하도록 설계하였을까요?저는 크게 2가지 측면에서 이러한 광범위한 콜백 관리 체계가 필요하다고 판단했습니다. 1. 세션 이벤트 처리SessionDelegate.swift에서는 다양한 URLSession 이벤트를 처리하기 위해 여러 델리게이트를 사용합니다:open ..
Swift 5.5에서 도입된 프로토콜로, 동시성 모델에서 특정 함수나 클로저가 스레드 간 안전하게 전달될 수 있음을 나타냅니다.@Sendable 프로토콜을 적용할 경우, 클로저나 다양한 타입에서 캡처하는 값이 Sendable 프로토콜을 마찬가지로 준수하는지 컴파일에 검사해줍니다. 이로서, 안정적으로 데이터 경쟁을 방지할 수 있게 되는 것입니다.따라서, @Sendable을 사용한다는 것은 적용된 대상이 Swift의 동시성 모델과 호환되도록 설계되었음을 명시적으로 나타내는 것입니다. Sendable 프로토콜 적용이 가능한 타입구조체모든 저장 프로퍼티가 Sendable을 준수하면, 자동으로 Sendable을 준수합니다.struct MyStruct: Sendable { let id: Int let n..

이번 글에서는 Kingfisher 라이브러리에서 가장 핵심이 되는 네트워킹 레이어에 대한 분석 내용을 정리해보겠습니다. 앞선 글에서 캐시 레이어(메모리 캐시, 디스크 캐시)에 대해 살펴보았다면, 이번에는 실제로 이미지를 다운로드하는 네트워킹 계층의 구조와 작동 방식을 심층적으로 분석해보겠습니다. 1. URLSession 개요먼저 Kingfisher의 네트워킹 레이어를 이해하기 위해서는 iOS의 URLSession 시스템에 대한 기본적인 이해가 필요합니다.URLSession이 뭐죠?URLSession은 iOS에서 네트워크 요청을 관리하기 위한 시스템 레벨의 API입니다. 앱에서 서버와 데이터를 주고받기 위한 HTTP/HTTPS 통신의 기반이 됩니다. 간단한 데이터 다운로드부터 백그라운드 전송, 인증 관리,..
객체데이터나 데이터를 조작하는 동작을 묶어 놓은 소프트웨어 단위. 주로 구조체나 클래스에 사용됨. 모듈코드 배포의 단일 단위. 프레임워크나 애플리케이션은 개별 모듈로 빌드되고 배포되며, Swift의 import 키워드를 사용하여 다른 모듈에서 임포트될 수 있습니다"Swift 패키지는 Swift 소스 파일과 매니페스트 파일(Package.swift)을 포함하는 디렉토리입니다. 매니페스트 파일은 패키지의 이름과 그 내용을 정의합니다. 패키지는 라이브러리, 실행 파일 및 Swift 코드로 작성된 다른 모듈의 배포 단위로 사용됩니다."패키지는 하나 이상의 Swift 모듈을 포함할 수 있으며, 각 모듈은 targets에 정의됩니다. 패키지는 모듈보다 상위 개념으로, 모듈들을 그룹화하고 관리하는 메커니즘을 제공합니..

동일한 이미지를 담는 NeoImage의 onSuccess 콜백이 반복호출되는 이슈가 있었습니다.@State private var imageTask: ImageTask?func updateUIView(_ uiView: UIImageView, context: Context) { let url: URL? = { switch source { case .url(let url): return url case .urlString(let string): if let string = string { return URL(string: string) } return nil ..

이번 포스트에서는 이미지 캐싱 라이브러리의 캐시 히트율을 높이기 위한 프로젝트의 첫 단계로, Kingfisher 라이브러리의 핵심 구조를 분석하고 필수 모듈을 추출한 과정을 공유하려 합니다.프로젝트 배경 및 목표최근 모바일 애플리케이션에서 이미지 로딩은 사용자 경험에 직접적인 영향을 미치는 중요한 요소입니다. 이에 저는 다음과 같은 가설을 세웠습니다:이미지에 대한 카테고리 정보를 이미지 데이터와 함께 제공받을 수 있다면, 사용자의 이미지 사용 패턴을 학습하여 캐시 히트율을 향상시킬 수 있다. 이 가설을 검증하기 위해 우선 기본적인 이미지 캐싱 라이브러리를 구축할 필요가 있었고, 널리 사용되는 오픈소스 라이브러리인 Kingfisher를 참고하여 핵심 기능만을 추출하는 작업을 진행했습니다.0. Kingfis..

1. 3차 리펙토링2차 리펙토링 이후, 구조에 대해 아래와 같은 문제점을 파악하게 되었습니다. 1. 서비스 레이어의 분산으로 인한 응집도 저하BookSearchService는 BookMatchAPI 모듈 내부에 위치한 반면, ImageProcessService와 TextExtractionService는 BookOCRKit에 위치했으며, BookValidationService는 BookRecommendationKit 내부에 위치했습니다.때문에 같은 비즈니스 로직을 담당하는 서비스 레이어 컴포넌트끼리의 응집도가 저하되는 문제가 있었습니다. 2. 의존성 관리의 복잡성2개의 최상위 모듈이 3개의 서비스 레이어 컴포넌트들 중 일부를 직접 import하여 사용하고 있기에 Service 레이어와 Integration..
1. 2차 리펙토링이후 아래와 같은 이유들로 인해 2차 리펙토링의 필요성을 느끼게 되었습니다.- DeepSeek api처럼 로직 목표를 공유하는 다른 외부 API를 추가하거나 대체하고자 할때, 많은 개발 리소스가 소요됨.- BookMatchModule 내부 기능상 다른 역할을 하는 메서드 2개가 공존하고 있기에, 유지보수 용이성이 저하됨.- BookMatchModule 내부 세부로직들에 대한 책임이 명확히 분리되어있지 않음. 따라서 크게 4가지 변경점을 가져가고자 했습니다.1. API 계층 개선2. BookMatchModule 책임 분리3. 계층적 디렉토리 구조 도입4. 서비스 계층 도입 2. API 계층 개선 API 클라이언트 분리기존에는 DefaultAPIClient라는 단일 클래스에서 모든 API..