일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파노라마 뷰
- 앱 성능 개선
- boilerplate 제거
- requirenativecomponent
- 네이티브
- privacyinfo.plist
- 360도 이미지
- react
- 스켈레톤 UI
- 리액트
- 라이브러리 없이
- launch screen
- 360도 뷰어
- launchscreen
- 스켈레톤 통합
- 스플래시스크린
- React Native
- panorama view
- native
- Privacy manifest
- React-Native
- Android
- ios
- react-native-fast-image
- 3b52.1
- Native Module
- 360도 이미지 뷰어
- Skeleton UI
- 리액트 네이티브
- 리엑트 네이티브
- Today
- Total
목록전체 글 (42)
Neoself의 기술 블로그
프린터 큐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..
Protocol은 뭔가요?프로토콜(Protocol)은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 규약을 정의합니다. 쉽게 말해 "이런 기능이 있어야 해"라는 약속입니다. Typescript에서의 interface 프로퍼티를 사용했던 적이 있어서인지, 사전적인 의미보다 인터페이스의 역할을 한다는 설명이 제게는 좀 이해하기 쉬웠던 기억이 납니다. 프로토콜을 채택하고자 하는 클래스에서는 실제로 돌아가는 로직 그 자체를 구현하는 반면, 프로토콜은 각 기능이 어떤 인자를 받고, 어떤 것을 반환하는 지의 타입 정보만 명시하고, 나머지들은 다 비워놓습니다.이렇게 프로토콜을 통해 구축한 핵심 틀만을 갖고, ViewModel과 같은 클래스에 상속시키는 것을 추상화한다고 합니다. 그래서 추상화가 ..
OSI 7계층 모델: 컴퓨터들이 서로 통신하는 방법을 7개의 층으로 나눈 표준 모델(기능 중심)응용 계층(7계층): 사용자가 직접 접하는 층, 이메일과 같은 앱 HTTP/HTTPS(웹 브라우저로 웹사이트 접속 시) FTP(서버-클라이언트 간 파일 전송시) DNS(도메인 주소를 IP주소로 변환 시) SSH(원격 서버에 안전하게 접속하고자 할 시)표현 계층(6계층): 파일 압축, 텍스트 인코딩과 같이 데이터의 형식을 변환하는 계층 SSL/TLS: 데이터 암호화 및 보안 통신 JPEG,MPEG: 이미지/영상 압축 ASCII: 문자 인코딩세션 계층(5계층): 통신하는 장치들의 대화를 관리하는 계층 SQL:데이터베이스 접근 및 조작 NetBIOS: 네트워크 상의 컴퓨터 간 기본적 통신전송 계층(4계층): TCP,..
벌집import Foundationlet input = Int(readLine()!)!var stdNum = 8 // 다음단계로 넘어가는 기준숫자var offset = 12 // 기준숫자 변동폭var ans = 2// 1의 경우, 변동폭 예외적으로 4 차이남 따라서 예외 케이스if input == 1 { print("1") } else { while true { if input 필요로 하는 블록 수가 변경되는 기준숫자값이 단계별로 일정하게 6씩 증가하는 것을 알 수 있었다. 다만 1에서 다음단계로 넘어갈 경우, 4씩 증가하였기에 이는 예외로 처리하여 고정적으로 1을 출력하게 해주었다. 블랙잭import Foundationlet arr = readLine()!.components(sepa..
XCode에서는 애플워치, 아이폰 등, 애플 생태계에 있는 기기들을 Simulator로 테스트 및 디버깅이 가능합니다. 하지만, 애플워치에서의 심박수 측정, WCSession 통신 등의 동작은 Simulator만으로는 테스트가 힘듭니다. 따라서 저는 여태껏 TestFlight로 앱을 배포하여 내부 테스트를 통해 로직 검증을 반복해왔었습니다... 이러한 과정을 반복하면서 디버깅을 하다보니, 아래 문제점들이 있었습니다.매번 앱스토어에서의 앱 처리 절차와, 테스트 플라이트 업데이트 등 많은 시간이 불필요하게 소요이미 배포가 된 앱을 테스트하는 것이기에 콘솔 출력을 통한 디버깅 불가능func syncPendingData(forced: Bool = false) { // 디버깅을 위한 메시지 iOS로 전송 ..
Testflight를 통해 실제 뮤지컬관람환경에서 실시간 심박수 측정 기능을 사용한 결과, WatchOS에서 전송한 분간 최대 심박수 데이터들에 대한 로그기록을 서버를 통해 확인할 수 있었습니다.(사실 가독성은 구려서 안 보시는게 눈건강에 더 나을 수도 있습니다. 백엔드는 잘 몰라서, 구현하기에 바빴습니다... )더보기보시면 아시겠지만, 오후 9시 35분부터 오후 10시 6분 사이의 데이터가 누락이 되는 이슈가 있었습니다. 당시 타임라인을 추적해본 결과, 심박수 데이터를 측정하는 전체 2시간 반동안 애플워치의 배터리를 16% 소모하였으며, 9시 35분부터는 배터리가 10% 이하로 떨어지면서 애플워치가 저전력 모드로 전환돼, 앱 내부 로직이 아예 막혀 서버로 데이터 전송이 되지 않았음을 확인할 수 있었..
요세푸스 문제import Foundationlet input = readLine()!.components(separatedBy:" ")var arr = Array(1...Int(input[0])!)var id = 0var ans:[String] = []while !arr.isEmpty { let targetId = (id+Int(input[1])!-1)%arr.count // K번째 사람 숫자 ans.append(String(arr[targetId])) // 숫자 배열에 더하기 arr.remove(at:targetId) // 해당 숫자 배열에서 제거 id=targetId}print("") 직각삼각형import Foundationwhile true { let arr = read..