일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- react-native-fast-image
- 파노라마 뷰
- react
- Android
- ssot
- 구조적 정체성
- 라이브러리 없이
- 리액트 네이티브
- 명시적 정체성
- 뷰 생명주기
- 360도 이미지 뷰어
- ios
- 360도 뷰어
- 네이티브
- 리액트
- 360도 이미지
- React Native
- native
- React-Native
- launch screen
- 스켈레톤 통합
- completion handler
- @sendable
- data driven construct
- launchscreen
- 앱 성능 개선
- panorama view
- requirenativecomponent
- SwiftUI
- 뷰 정체성
- Today
- Total
목록2025/03 (7)
Neoself의 기술 블로그

앱에서 이미지를 빠르게 로딩하는 것은 사용자 경험에 중요한 영향을 미칩니다. 특히 자주 방문하는 화면의 내 이미지 로딩 속도는 앱의 전반적인 체감 성능에 직접적으로 연결됩니다. 이번 글에서는 NeoImage 라이브러리에 우선순위 캐시 전략을 도입하여 나의 책장 탭의 이미지 로딩 시간을 단축한 과정을 소개합니다."나의 책장" 탭은 사용자가 보유중인 책의 이미지를 포함하고 있습니다. 이 탭으로 진입할 때마다 메모리 저장소에 캐싱되어있지 않으나, 디스크에 이미지 데이터가 캐싱되어있을 경우, io 작업에 의한 오버헤드가 발생했고, 이는 사용자 경험을 저하시키는 요인이 될 수 있다고 판단했습니다.loaded with NeoImage in 0.01776 seconds loaded with NeoImage in 0...
누적합 방식으로 해당 문제를 접근하고자 했습니다.실제 기둥을 순회할때마다, 순회하였던 이전 기둥보다 높이가 낮으면 무시해야했기 때문입니다.하지만, 이러한 누적합 형태는 가장 높은 기둥이 나올때까지만 반복해야만 합니다. 따라서, 가장 높은 높이의 기둥 위치를 저장한 후, 이를 기준으로 2개의 부분집합으로 나누어 누적합 연산을 각각 수행하였습니다.let num = Int(readLine()!)!var arr = Array()for _ in 0.. 이 과정에서 가장 시간이 오래 걸렸던 부분은 오른쪽에서 왼쪽으로 수행되는 수행되는 누적합 연산의 인덱스 참조였습니다. 특히 stride의 경우, through와 from에 전달되는 값은 실제로 순회되는 값 중 하나이기에 index out of range를 조심해야합..
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에 정의됩니다. 패키지는 모듈보다 상위 개념으로, 모듈들을 그룹화하고 관리하는 메커니즘을 제공합니..