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

이 글은 SwiftUI 관련 WWDC 세션들의 주요 내용을 기초부터 심화까지 포괄적으로 다루고 있습니다. SwiftUI를 처음 접하시거나, 익숙치 않은 분들에게 도움이 되었으면 합니다. 0. 목차더보기1. SwiftUI 소개1.1 SwiftUI의 핵심 특징1.2 저수준 API1.3 앱 정의에도 사용되는 SwiftUI2. 선언형 UI의 특성2.1 예측 가능한 상태 관리2.2 스레드 안정성2.3 성능 저하 요소 최소화2.4 넓은 범위의 적응성(Adaptivity)3. SwiftUI의 상태 관리3.1 상태 기반 UI 뷰 업데이트 사이클3.2 Property Wrapper와 의존성 관리3.3 Single Source of Truth (SSOT)3.3.1 데이터 모델과 UI(ViewModel)의 분리3.3.2 데..
이글은 Tree구조의 알고리즘 문제를 풀고자할때, 제가 취했던 접근방식들을 정리하고자 작성한 글입니다. 미숙한 점이 아직 많지만, 정리가 되는대로 업데이트를 진행하고자 합니다. 알고리즘을 풀기 이전 가장 먼저 정해야할 것은 탐색 방식을 결정하는 것입니다.DFS: 경로찾기, 사이클 탐지와 같이 한 경로를 끝까지 탐색한 후 다른 경로를 탐색하는 방식의 경우 사용BFS: 최단 경로 문제나 레벨 단위 처리와 같이 같은 레벨의 노드들을 먼저 탐색하는 방식의 경우 사용탐색방식이 결정되었다면, 어떤 패턴을 사용할 수 있는지 확인합니다.Bottom-up 접근최하단 노드부터 루트로 올라가는 방식:트리의 높이 구하기, 트리의 지름구하기와 같은 케이스에 유용Top-down 접근경로의 합구하기, 레벨 순회와 같이 루트에서 시..

컴퓨터 시스템의 구성요소CPU컴퓨터의 두뇌 역할을 하는 중앙처리장치로, 실제 연산과 명령어 처리를 담당합니다. 산술논리연산장치(ALU)와 제어장치(CU)로 구성되어 있습니다. RAM주기억장치로, CPU가 직접 접근할 수 있는 고속의 휘발성 메모리입니다. 실행 중인 프로그램과 데이터를 임시로 저장합니다. 저장장치HDD나 SSD와 같은 비휘발성 메모리로, 전원이 꺼져도 데이터가 유지됩니다. CPU와 메모리 간의 데이터 교환은 버스 시스템을 통해 이루어집니다. 여기서 버스는 전기적 신호를 전달하는 물리적 와이어들의 집합이라고 이해하면 쉽습니다. 버스는 아래와 같은 유형으로 나뉩니다.데이터 버스: 양방향 통신을 지원하며, CPU 및 다른 장치들 사이의 실제 데이터를 전송합니다.주소 버스(Address Bus):..
최근 iOS 앱의 소셜 기능 개발 과정에서 복잡한 API 호출 체인을 다루게 되었습니다. 사용자의 피드를 구성하기 위해 여러 API를 순차적으로 호출하고 데이터를 조합해야 했는데, Combine을 사용한 기존 접근 방식에서 여러 한계점을 경험했습니다. 이 글에서는 우리가 겪은 문제점들과 Swift Concurrency로의 전환을 통해 이를 해결한 과정을 공유하고자 합니다. 1. 기존 코드의 구조와 한계점소셜 피드를 구현하기 위해 다음과 같은 연쇄적인 API 호출이 필요했습니다:func fetchFriendsWithCalendarData(yearMonth: String) { isLoading = true // 1. 친구 목록 가져오기 socialService.getFriends() ..

앱의 QA 과정 도중, TagEditView에서 태그를 수정하게될 경우, 로딩 인디케이터가 무한히 표시되며 다른 상호작용이 동작하지 않는 특이한 현상을 발견했습니다. 로딩 인디케이터가 표시된 이후, 다른 상호작용에 의한 뷰업데이트가 진행되지 않았던 것을 미루어 보았을때, UI 업데이트를 책임지는 메인쓰레드를 다른 작업이 항시 점유하고 있다는 것을 예상해볼 수 있었습니다. 따라서 XCode에서 제공하는 Instrument 도구의 Time Profiler 기능을 활용해 메인쓰레드를 점유하는 작업이 무엇인지 프로파일링해보았습니다.1. XCode Instrument 툴을 활용한 뷰 재구성 이슈의 시작점 파악1.1 쓰레드 점유 작업 확인그 결과, TagEditView에서 태그정보에 대한 변경이 완료되는 17초 ..

기존 TyTE 앱의 회원가입 플로우에서는 영어 username만을 사용할 수 있도록 하였는데요. MVP 모델 출시 이후, 한글 닉네임도 허용할 수 있게 해달라는 피드백을 반영해, 이번 1.1버전 업데이트를 통해 사용자 이름에 한글도 허용하도록 정책을 변경하게 되었습니다.이를 위해 사용자 이름의 유효성을 판단하는 usernamePredicate를 수정하였는데, 이 변경이 회원가입 플로우에 영향을 주지 않는지 확인하기 위해 XCTest를 활용, 단위 테스트를 작성 및 검증해보고자 했습니다. 1. 테스트 설계 접근 방식OnboardingView의 핵심기능인 회원가입 플로우를 검증하기 위해, 테스트가 필요한 핵심요소들을 정의했습니다. 1.1 검증 대상 정의1. 필드별 유효성 검사- Username- Passwo..
프린터 큐import Foundationfor i in 0 ..queue[0].priority}) { queue.append(queue.removeFirst()) } else { // 대상 문서일 경우 출력 및 while문 중단 if queue[0].index == M { print(cnt+1) break } // 맨 앞의 문서 출력하여 제거 및 cnt에 1 추가 queue.removeFirst() cnt+=1 } }}대상 문서가 최종적으로 몇번째에 출력되는지 확인하기 위해선, 모든 ..
본 게시글은 Keychain, UserDefaults를 활용하여 로그인 여부를 영구적으로 관리하고 Combine을 통해 뷰를 업데이트하는 로그인 플로우 고도화 과정을 공유하고자 작성된 글입니다. 로그인 플로우 파악에 더 나아가, 자동로그인 및 자동 로그아웃 기능을 고려하시는 개발자 분들께 도움이 되시리라 생각합니다.1. 기존 로그인 플로우의 한계우선 제가 여태껏 구현해왔던 로그인 및 로그아웃 플로우를 간단하게 소개드리겠습니다.AppState라는 싱글톤 패턴 기반의 클래스를 환경객체로 앱에 적용한 후, 로그인 여부 불린값 isLoggedIn을 통해 보이는 뷰를 관리하였습니다. class AppState: ObservableObject { static let shared = AppState() ..
프린터 큐for i in 0 ..queue[0].priority}) { queue.append(queue.removeFirst()) cnt+=1 } else { // 대상 문서일 경우 출력 및 while문 중단 if queue[0].index == M { print(cnt) break } // 맨 앞의 문서 출력하여 제거 및 cnt에 1 추가\ queue.removeFirst() cnt+=1 } }} 기존 코드더보기import Foundationvar cnt: Int..
분해합let input = readLine()!let startNum = max(0,Int(input)!-9*input.count) // 생성자의 최소가능값var ans = 0for num in (startNum.. 후위 표기식2import Foundationlet N = Int(readLine()!)!let arr = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ").map { String($0) }[0..