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

1. SwiftUI에서의 포커스 관리 방법FocusState API사용자의 주의력을 유도하기 위해 포커스의 이동을 커스텀할 수 있습니다.여기서 FocusState는 현재 포커스 위치에 따라 변화하는 상태를 의미포커스된 Field의 식별자를 보관하는 데에 사용됩니다.FocusedField 변수는 enum 타입으로 정의되며, 문자열, 정수 또는 해시 가능 값 타입을 사용할 수 있습니다.이 수정자는 포커스의 배치와 관련된 상호연결을 생성합니다.좌측 예시의 경우, 이메일 형식이 올바르지 않으면, focusedField를 .email로 설정하여 이메일 입력 필드로 포커스를 되돌리는 로직이 구현되어있으며, 빨간색 테두리가 표시되는 조건에도 이 focusedField의 상태를 활용합니다.만일 폼 데이터가 모두 유효한..

iOS 17버전 이상부터 사용할 수 있는 Scrollview에 대한 아래 개선사항을 정리하고 있습니다.여백 관리스크롤 타겟 및 위치 제어스크롤 전환 효과LazyVStack(iOS14+)감싸진 내부 콘텐츠는 초기 렌더시 모든 콘텐츠를 적극 evaluate하지 않고, 보일때마다 evaluate하여 성능을 최적화합니다.1. ScrollView와 안전 영역 및 콘텐츠 여백 관리1.1. SafeArea 스크롤 뷰는 SafeArea를 사용해 콘텐츠를 보호하고, 콘텐츠 바깥 여백으로 SafeArea를 분할해, 콘텐츠가 안전 영역 안으로 확실히 들어갈 수 있도록 합니다. 1.4. SafeAreaPadding좌측에 사용된 일반 패딩 수정자와 똑같이 동작하지만, 콘텐츠가 아니라 SafeArea에 패딩을..

1. Actor데이터를 안전하게 보관하는 상자와 같은 개념으로, 공유 mutable 상태를 보호하기 위한 동기화 매커니즘입니다.자체 상태는 프로그램의 다른 영역과 격리되며, 액터 접근을 위해선 액터를 반드시 통과하며 이때, 액터의 동기화 메커니즘은 다른 코드가 액터의 상태에 동시에 접근하지 않도록 보장합니다.속성, 메서드 초기화, 서브스크립트를 가질 수 있으며, 프로토콜을 준수하고 확장으로 보강될 수 있습니다.저레벨에서 제공하는 직렬 DispatchQueue와 NSLock처럼 상호 배제를 제공하지만, 저레벨 동기화 매커니즘과 달리 엄격한 컴파일러 오류를 통해 동기화를 안정적으로 수행할 수 있도록 돕습니다. 1.1. 동작 원리프로그램의 나머지 부분에서 인스턴스 데이터를 격리하고, 해당 인스턴스 데이터에 대..

일반 함수의 경우, completion handler를 통해 작업을 호출하면, 곧바로 스레드 제어권을 다시 함수가 갖게 되지만, async 함수는 작업이 완료되면 스레드를 일시 중단하여 함수가 갖고 있던 스레드 제어권을 시스템에 넘깁니다. 이 과정에서 호출자 즉 함수 역시 일시 중단됩니다. 만일 fetchThumbnail에서 비동기 메서드를 호출하면, 스레드의 제어권을 시스템에 넘겨주고, 시스템에게 URL Session의 data 메서드 작업을 예약해달라고 요청합니다.이 시점에서 시스템이 제어권을 가지게 되기에, 작업이 바로 시작되지 않으며, 다른 작업에 사용될 수 있습니다.설령, 늦게 시작된 다른 작업이 먼저 실행된 이후, data 메서드가 재개될 수 있습니다.이렇게 system에 의해 data 메서드..

위 예제는 비동기 및 동시성 코드를 사용하지만, 이러한 코드 작성을 용이하게 하기 위해 구조적 프로그래밍을 활용하지 못하고 있다즉, 함수가 호출되었을 때 값을 반환하지 않으며, 결과나 오류를 완료 핸들러에 전달하기 때문에, 오류 처리를 위한 구조적 제어 흐름을 사용할 수 없으며, 썸네일 처리를 위한 루프 또한 사용이 불가하다. Task- 프로그램의 실행 컨택스트- 비동기적으로 실행될 코드의 독립적인 단위- Swift 컴파일러는 이러한 태스크들을 스레드에 할당하여 병렬성을 확보- 각 작업는 다른 실행 컨텍스트(Executing Context)와 동시에 실행되며, 안전하고 효율적일 때 자동으로 병렬로 실행되도록 스케줄링됩니다.* async 함수를 호출한다고 해서 호출을 위한 새로운 작업이 생성되지 않으며,..

앱에서 이미지를 빠르게 로딩하는 것은 사용자 경험에 중요한 영향을 미칩니다. 특히 자주 방문하는 화면의 내 이미지 로딩 속도는 앱의 전반적인 체감 성능에 직접적으로 연결됩니다. 이번 글에서는 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..