Realm Notification Token

YongJunCha·2021년 9월 8일
0

Realm

목록 보기
1/4
post-thumbnail

회사에서 개발을 하던 중 Realm Result 타입은 삭제가 삭제하면 index 오류가 생겨서 VO 객체에 담아서 보여주고, 삭제나 업데이트 추가를 할 경우는 콜백을 통해 VO객체에 다시 담아주는 과정을 실행해주고 있었다.

*index 오류가 생기는 이유는 값을 계속 받고 있는데 어느 지워지는 순간 삭제되는 데이터의 index가 비게되면서 오류를 발생시킨다고 한다 ( StackOverFlow 해석)

실제로 위의 방법대로 하게되면 @escaping으로 콜백을 하게 되는데
현재 프로젝트에서는 MVVM 구조(model + repository + repositoryImpl + Dao)이기 때문에 코드양이 엄청나게 많아졌다.

나는 이 부분을 개선하는 솔루션이 반드시 있을 것이라고 생각을 했고, MongoDB Realm 문서와 Youtube를 뒤지기 시작했다.

많은 자료를 탐구하던중 RealmNotification 과 ObjectWillChange에 대해서 알게되었다.

What is Realm NotificationToken?

  • Realm Notification 이란 Realm Object에 변화가 생겼을 때 이를 알려주는 기능이다.
@Published var User : Results<SoccerPlayer>?
var token : NotificationToken?

token = User.observe { changes in
    switch changes {
    case .initial:
        tableView.reloadData()
    case .update(_, let deletions, let insertions, let modifications):
    objectWillChange.send()
    case .error(let error):
        // handle error
        ()
    }
}

Observing 하고있는 객체의 값이 바뀌면 ( 삭제 추가 수정)
objectWillChange.send() 가 불리고 삭제가 된다.
이렇게 되면 result 값을 바로 삭제해도 index 에러가 나지 않게 된다.

(Youtube 자료를 찾아보면, 수정 삭제를 할 경우에는 ForEach 문에서 .freeze()를 쓰고 업데이트 삭제를 하라고 했지만 아래의 코드로 테스트를 해 본 결과 freeze가 없어도 수정 삭제가 원활하게 동작했다.)

Realm은 SQL처럼 JOIN이 없기 때문에 VO객체를 통해 필요한 데이터를 정제해서 쓰게 되는데, VO객체 또한 굳이 @escaping으로 콜백을 쓸 필요 없이

.update 부분에 VO 객체에 데이터를 담는 메소드를 불러주면 코드의 양을 확 줄일 수 있다.
.궁극적으로는 굳이 Parsing할 필요도 없을 수 있다..

@Published var User : Results<SoccerPlayer>?
var token : NotificationToken?

token = User.observe { changes in
    switch changes {
    case .initial:
        tableView.reloadData()
    case .update(_, let deletions, let insertions, let modifications):
    objectWillChange.send()
    // 이 곳에서 Parsing 메소드를 부른다. 
    parseUserToVoData()
    case .error(let error):
        // handle error
        ()
    }
}

현재까지는 @Published 에만 Token을 달아서 썼는데 블로그를 쓰면서 더 찾아보니 Object 자체를 Observing 하는 방법도 있어서 2편에서 정리해서 다뤄볼 생각이다.

이걸 안 만들었을까? 의심이 될 때는 역시 공식 문서를 꼼꼼히 뒤져보는 것도 하나의 해결책인 것 같다.

0개의 댓글