오늘도 더 나은 코드를 작성하였습니까?

Frozen Architecture - Kotlin SDK 본문

kotlin Multiplatform/realm-kotlin-kmm

Frozen Architecture - Kotlin SDK

hik14 2022. 7. 25. 11:13

Realm SDK(java, swift)와 달리 Kotlin SDK는 기본 데이터와 동시에 업데이트되는 라이브 객체 및 컬렉션을 제공하지 않습니다.

대신 Kotlin SDK는 스레드 간에 안전하게 전달할 수 있는 frozen objects에서만 독점적으로 작동합니다.

Work with Frozen Objects

 frozen objects는 Realam에서 데이터가 변경될 때, 자동으로 업데이트되지 않기 때문에 다른 Realm SDK에서 사용했을 수 있는 라이브 객체와 약간 다르게 작동합니다.

Access a Live Version of Frozen Object

객체를 modifiy하려면 live 상태여야 합니다.

mutableRealm.findLatest()를 사용하여 트랜잭션에서 frozen object를 live object로 변환할 수 있습니다.

live object는 write 또는 writeBlocking{ }내의 쓰기 트랜잭션 내에서만 액세스할 수 있습니다.

 

write{ } 클로저에서 반환된 객체는 쓰기 트랜잭션이 완료되면 frozen object가 됩니다.

 

*findLatest

- write{ } 은 항상 최신 버전의 데이터에서 작동합니다. 

- frozen object의 최신 버전을 쉽게 찾고 write{ } 내에서 수정할 수 있(managed)는 복사본을 반환

      lifecycleScope.launch {
            DataBase.realm.write {
                val person = this.findLatest(person!!)
                person?.name = "haha"
            }
            Log.d(TAG, "onCreate()::person::${person}")
        }

Thread-safe Realms

Realm 클래스는 더 이상 스레드의 제한을 받지 않는다

여러 스레드에서 realm 을 공유할 수 있습니d다.

더 이상 Realm.close()를 호출하여 명시적으로 Realm 수명 주기를 처리할 필요가 없습니다.

 

Access Changes

- Coroutines and the Flow API을 이용하여 객체를 변경.

- 변경된 사항은 스레드로부터 안전하므로 모든 컨텍스트에서 액세스할 수 있다.

- 알림은 전용 내부 알림 스레드에서 처리

- frozen object는 변경 리스너 지원.

val config = RealmConfiguration.Builder(schema = setOf(Task::class))
    .build()
val realm = Realm.open(config)
// fetch objects from a realm as Flowables
CoroutineScope(Dispatchers.Main).launch {
    val flow: Flow<ResultsChange<Task>> = realm.query<Task>().asFlow()
    flow.collect { task ->
        Log.v("Task: $task")
    }
}
// write an object to the realm in a coroutine
CoroutineScope(Dispatchers.Main).launch {
    realm.write {
        copyToRealm(Task().apply { name = "my task"; status = "Open"})
    }
}

Lazy Loading

- Realm 객체는 기본적으로 여전히 Lazy load 됩니다.

- 디스크에서 많은 양의 데이터를 읽지 않고도 많은 개체 컬렉션을 쿼리할 수 있습니다.

- 객체의 필드에 대한 첫 번째 액세스가 항상 가장 최근 데이터를 반환함을 의미합니다.

'kotlin Multiplatform > realm-kotlin-kmm' 카테고리의 다른 글

Realm Kotlin Create  (0) 2022.07.25
Realm Transaction  (0) 2022.07.25
Realm kotlin scheme  (0) 2022.07.25
Realm kotlin schem(Data Type)  (0) 2022.07.25
Realm (Kotlin)  (0) 2022.07.22