안녕하세요. 후르륵짭짭입니다.
오랜만에 Realm에 관련된 글로 찾아옵니다.
최근들어 Realm을 다룰 일이 없어서 포스팅을 거의 안하게 되는 것 같네요.
Realm을 다루다 보면 Thread 때문에 굉장히 Crash가 많이 발생 합니다.
따라서 조심스럽게 사용해야한다는 특징이 있어요
** 대량의 데이터 저장시 발생하는 UI Blocking **
위의 코드 처럼 약 1000개의 데이터를 Main Thread를 통해 DB에 저장하려고 시도하면 약 20초 정도 시간이 걸리게 됩니다.
그래서 Background에서 DB를 저장하는 시도를 해야합니다.
** 백그라운드에서 데이터 저장 **
위 사진을 보면 autoreleasepool을 사용했습니다.
autoreleasepool을 설정하면 해당 코드가 메모리 해제 되는 것을 모든 작업을 마쳤을 때로 보장해줍니다.
따라서 백그라운드 작업을 할 때는 안정성을 높이기 위해 Autoreleasepool을 사용해주는게 좋습니다.
위와 같이 했을 때 백그라운드 작업이 20초 걸리게 됩니다.
** Batch 작업을 통해 DB저장 시간을 줄이자 **
위의 내용과 비교하면 1000개의 트랜젝션을 발생 시키는 것이 아니라 500번에 한번 트랜젝션을 발생 시키도록 하고 있습니다.
이렇게 트렌잭션을 줄이는 방법이 성능을 높이는 하나의 방법 입니다.
위와 같이 작업 했을 때 0.3초가 걸리게 됩니다.
** 다른 쓰레드에서 Realm 작업 **
Realm은 안정성을 위해서 하나의 쓰레드에서 작업하도록 되어 있습니다.
따라서 A 쓰레드에서 Realm 객체를 생성하고 B 쓰레드에서 해당 Realm 객체를 사용하면 충돌이 발생 합니다.
이렇게 Realm 객체를 사용하면 충돌이 발생합니다.
다른 쓰레드에서 사용하기 위해서는 ThreadSafeReference를 사용해야합니다.
ThreadSafeReference 에 사용할 객체를 넣어줍니다.
우리는 Airport라는 객체를 ThreadSafe하게 만들어주고
다른 쓰렉드에서 Realm 객체를 생성하고 resolve를 통해 쓰레드 통일화 시켜줍니다.
그리고 내용물을 변경 해줍니다.
위와 같이 ThreadSafeReference를 통해 기존에 있던 값의 내용을 다른 쓰레드에서 변경할 때 유용하게 사용 할 수 있게 됩니다.
** Realm의 장점 AutoRefresh **
Realm의 가장 큰 장점은 바로 AutoRefresh 기능 입니다.
다시 Read를 통해 값을 읽어오는 CoreData와 다르게 Realm은 바로 값이 갱신이 됩니다.
하지만 이 기능은 동일한 Run loop가 작동하는 Main Thread에서 작동하고
Background Thread에서는 Run loop가 작동하지 않아서 Auto Refresh가 작동하기 어렵습니다.
따라서 위의 코드 처럼 Realm 객체의 refresh를 통해서 값을 갱신 해주는 방법을 사용 해야합니다.
참고 사이드 :
https://ali-akhtar.medium.com/concurrency-multi-threading-in-realm-realmswift-part-4-2345deabe512
'DataBase > IOS - Realm' 카테고리의 다른 글
IOS) Realm - Compact FileSize 그리고 주의할 사항 (0) | 2022.07.24 |
---|---|
IOS)Realm - Migration (0) | 2022.05.23 |
IOS)Realm - Configuration & Extension Realm Share - 1 (0) | 2022.02.13 |
IOS) Realm - CRUD Operation & Notification - 3 (2) | 2021.12.12 |
IOS) Realm - CRUD Operation & Notification - 2 (0) | 2021.12.04 |
댓글