일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 인프런파이썬강의
- 파이썬중급강의
- rxswift
- nodeJS
- 토플공부수기
- IOS프로그래밍
- 리프2기
- 교환학생토플
- 자바스크립트
- SwiftUI
- 파이썬웹크롤링
- 프로그래머스
- 인프런강의
- 우리를위한프로그래밍
- 인프런파이썬
- 스위프트
- 토플
- JS
- 유학토플
- 파이썬
- uikit
- Python3
- IOS
- 카카오톡채팅봇
- 파이썬중급
- 인프런오리지널
- 노드JS
- swift
- 인프런
- 웹크롤링
- Today
- Total
목록앱 (58)
먹고 기도하고 코딩하라

저번에 Realm의 마이그레이션에 대해 살펴봤다. Realm 파일을 열려면 다음과 같이 써주면 된다. let realm = try! Realm() 그런데 문득 무지성으로 이렇게 많이 쓴 Realm()을 보니 이 수많은 Realm 객체들이 메모리를 심각하게 많이 차지하고, 심지어 제때 메모리에서 해제되지 않아 memory leak이 나면 어쩌지, 걱정되는 날이 올 수도 있다. 결론부터 말하자면 Realm 객체가 한 스레드에 여러 개 생기는 일은 없다. 그러므로 걱정하지 말고 Realm 접근이 필요할 때마다 Realm()으로 Realm 객체를 가져오면 된다. 그런데 어떻게 그게 가능할까? try! Realm() 을 했을 때 Realm은 과연 어떤 작업을 하게 될까? 자칫 원론적인 이야기가 될 수 있기 때문에..

저번에 여러 스레드에서 Realm을 써야 할 때, 어떻게 써야 앱을 살리면서 쓸 수 있는지 살펴봤다. 이번 포스팅에서는 Realm의 Configuration과 스키마 버전을 올릴 때의 마이그레이션 블록에 대해 살펴본다. 2. 마이그레이션 Realm의 스키마 버전(schemaVersion)을 올려야 할 때가 있다. 모델을 새로 생성하거나, 기존의 모델의 필드를 rename하거나 기타 수정을 가하든지 원래 있던 모델을 삭제한다든지 하는 경우이다. column을 추가하거나 새로운 Object를 추가하는 등의 별도 수동 마이그레이션 작업이 필요없는 수정이 있는 경우에는 마이그레이션 블록을 비울 수 있고, 그렇지 않은 경우에는 마이그레이션 블록을 써야 한다. 이 과정에서 Configuration이 개입하는데, 말..

iOS 앱에서 로컬에 데이터를 저장하는 방법은 여러 가지가 있다. 퍼스트파티인 CoreData도 있고, SQLite나 Realm을 쓸 수도 있다. 그 중 Realm의 장점은 속도가 빠르다, 안드로이드나 윈도우, 맥 등 크로스플랫폼 사용이 가능하다, SQL처럼 데이터 스키마를 Table 형식으로 구성하고, 데이터를 row 등으로 관리하는 게 아니라 OOP 패러다임에 맞게 클래스와 객체로 관리한다 등.. 여러 가지가 있다. 우리 회사 iOS 앱은 현재 클립 데이터를 다운로드받는 데에 Realm을 사용하고 있다. 개인 프로젝트에서도 Realm을 쓰긴 했는데 기획도 개발도 내가 하다 보니 요구 사항이 심플해져서 딥하게 쓸 일은 딱히 없었다. 하지만 회사 앱은 기획에 맞게 타이트하게 기능 개발을 해야 해서 이 기..
Swift 5.6 버전이 나온지 어느덧 1년이 지나 다소 뒷북이긴 한데 의외로 많이 알려지지 않은 것 같다. 사실 if #unavailable에 대한 설명 자체는 여기에 잘 정리되어 있는데, 간단히 살펴보고 어떤 경우에 쓰면 좋은지를 함께 소개하고자 한다. 기존 if #available의 쓰임새 타겟 기기의 iOS 버전에 따라 분기를 태워야 하는 경우가 있다. 최근에 카플레이를 해서 이걸로 예시를 들자면, Carplay 프레임워크는 iOS 14 이상에서만 사용할 수 있다. 그리고 이 프레임워크를 사용해야 카플레이를 지원하기 위한 앱을 프로그래밍할 수 있다. 그러니까 다음과 같은 상황이다. 주 기능은 원래 제공하고 있었다. iOS 14 이상에서는 카플레이도 추가로 제공하겠다. 즉, 플랫폼별로 제시하는 OS..
회사에서 3번째로 맡은 프로젝트는 구글 로그인 지원이다. 웹, 안드로이드에서는 구글 로그인이 지원되는데 iOS에는 해당 기능이 없어 이번에 추가하게 됐다. 예전에 해본 적은 있었는데, 다시 하려니 뭔가 헷갈려서 정리한다. 글을 수정하는 2023년 4월 기준 구글 로그인 최신 버전은 7.0.0이다. 5 버전과 좀 달라졌다 하는 건 GIDSignIn.sharedInstance를 어떻게 쓰느냐 여부와 SignIn을 delegate 방식으로 하느냐 바로 클래스 메소드를 사용하느냐 하는 약간의 차이만 있다. 순서 (1) Podfile 혹은 SPM으로 GoogleSignIn 패키지를 추가한다. (2) 파이어베이스 콘솔 들어가면 OAuth 2.0 클라이언트 ID를 확인할 수 있다. com.googleuserconte..
2월 한 달동안 회사에서 데이터를 기기에 저장하는 작업을 진행했다. M 대리님이 하던 작업인데, 중간에 어떤 문제 때문에 꼬여서 중단됐던 걸 내가 맡아서 에러 고치고 기능 마저 구현하고 QA 티켓 처리하면서 마무리짓게 됐다. (곧 배포 예정! 예이~) QA에서 나온 이슈 중에 하나가 클립을 다 재생하면 앱이 강제종료된다는 거였는데, 로그를 찾아보니 RLMException 때문에 죽고 있었다. 클립을 다 재생하면 위젯 데이터를 업데이트하는 함수를 호출하게 되어 있는데, 오프라인 모드일 때는 Realm에서 값을 읽어오는 작업을 한다. 여기서 exception이 일어났다. 원인 이 에러는 보통 Realm 객체를 생성한 스레드와 Realm에 접근하는 스레드가 다르기 때문에 발생한다. Realm은 thread-c..
요즘 회사에서 다운로드 작업을 하고 있다. 까다로운데, 또 까다로운만큼 해결할 때의 쾌감이 장난 아닌 작업이다. 정처기 공부할 때 DRM 봤을 때는 이게 나랑 연관 있는 얘기 될 줄 몰랐지.. 팔자에도 없는 줄 알았더니 -_- 아무튼 이 태스크 때문에 이슈가 조금 있어서, 왜 iOS 버전에 따라 태스크를 달리 써야 하는지, 또 이 태스크가 근본적으로 무슨 차이가 있는지 좀 알아봤다. 사실 AVAssetDownloadTask는 iOS 9+, AVAggregateAssetDownloadTask는 iOS 11+ 이상을 지원해서 11 이상을 지원하는 우리 앱에서는 사실 일괄적으로 Aggregate 써도 상관없긴 한데, 또 이게 으른의 사정과 내부적인 이슈가 있어서 버전별로 태스크를 나눠 쓰고 있다. Swift로..
파이썬으로 문제를 풀다가 최근에는 스위프트로 문제를 푸는 연습을 했다. 제일 난감했던 것 중 하나는 스위프트 String은 인덱스를 지정할 때 그냥 Int형 숫자를 쓸 수 없고 String.index 타입을 써야 한다는 거다. String에 extension으로 커스텀 코드 추가하면 배열 접근하듯이 쓸 수 있게 만들 수 있는데, 문제 한 개 풀 때마다 귀찮아서 그 짓 어떻게 하나 싶기도 하다. 어차피 문자열 안 다룰 수는 없으니까 그냥 겸사겸사 index를 같이 본다. 문자열 인덱싱 var lyrics = "Thunder only happens when it's raining" print(lyrics[lyrics.startIndex])// T print(lyrics[lyrics.index(before: ..