Realm ObjC & Swift 2.4: 객체 알림 기능 추가!
Realm Objective‑C와 Realm Swift 2.4 버전을 출시합니다. 이번 릴리즈에서 추가된 객체 레벨의 알림으로 저희 라이브 오브젝트에 더 많은 생명을 불어 넣었습니다. 이제 여러분의 앱이 개별 객체가 업데이트될 때마다 쉽게 응답할 수 있습니다.
객체 레벨 알림
지금까지는 객체의 변경을 알고 싶으면 컬렉션에 포함된 객체가 삭제, 삽입, 수정되는 시점을 알려주는 컬렉션의 알림을 이용해야 했습니다. 하지만 어떤 속성이 변경됐는지까지는 알 수 없었죠. 또한 단일 객체를 비동기적으로 관찰하기 위해 컬렉션을 만드는 것은 부자연스럽고 비용도 많이 들며, 쿼리로 쉽게 고유하게 표현할 수 없는 객체인 경우 정의가 어렵기까지 합니다.
우리는 단일 객체의 속성 레벨 변화를 감지하기 위해 KVO를 지원하고 있지만, KVO는 꽤나 지저분하기로 유명하며 한 KVO 알림당 하나의 속성만 지원합니다. 또한 KVO는 크로스 플랫폼이나 크로스 언어가 아닙니다. KVO 알림은 심지어 비동기식 이므로 UI 스레드를 멈추게 하는 경우마저 있죠 🙀.
이번 릴리즈에 제공되는 객체 레벨의 알림은 가장 유용한 방식으로 단일 객체의 변화를 알아차릴 수 있도록 합니다. 객체 알림은 매우 간단한 API로 제공되며, 컬렉션 알림과 마찬가지로 관찰하려는 객체에 알림 블럭을 추가하기만 하면 됩니다. 알림을 생성하면 NotificationToken
이 반환하며, 개체에 대한 알림을 사용한만큼 유지해서 사용합니다.
알림이 시작되면 콜백은 정확히 어떤 속성이 변경됐는지 혹은 관찰하던 객체가 삭제됐는지 등의 자세한 정보를 ObjectChange
구조체로 알려줍니다.
class Message: Object {
dynamic var isRead = false
dynamic var content = ""
}
class MessageController: UIViewController {
private let notificationToken: NotificationToken
init(message: Message) {
notificationToken = message.addNotificationBlock { change in
switch change {
case .change(let properties):
if let readChange = properties.first(where: { $0.name == "isRead" }) {
self.showReadBadge = readChange.newValue as! Bool
}
if let contentChange = properties.first(where: { $0.name == "content" }) {
self.contentView.textValue = contentChange.newValue as! String
}
case .deleted:
self.handleDeletion()
case .error(let error):
self.handleError(error)
}
}
}
deinit {
notificationToken.stop()
}
}
객체에 대한 알림이 더 필요하지 않은 경우 간단히 token.stop()
를 호출하거나 토큰 객체를 해제하세요.
전체 사용 과정을 요약하면, addNotificationBlock
으로 관리 객체에 대한 알림을 만들고, 반환된 NotificationToken
인스턴스를 유지한 상태로, 콜백 내부에서 앱에 필요한 모든 업데이트를 처리합니다.
몇 가지 주의 사항이 있습니다. 리스트 속성이 변경된 경우, newValue
나 oldValue
데이터를 볼 수는 없지만 알림은 계속 실행됩니다. 또한 동기적으로 UI 쓰기를 만들어야 하거나 지정된 쓰기에 대한 알림을 무시할 필요가 있다면 realm.commitWrite(withoutNotifying: [token])
에 객체의 알림 토큰을 전달해서 interface 구동형 쓰기 기능을 사용할 수 있습니다.
버그 수정
이번 릴리즈에서 동기화 Realm에 대해 만료된 인증 토큰을 업데이트하는 시점의 몇 가지 오류 처리 문제를 수정했습니다.
토큰 만료 이슈를 피하기 위해 모든 Realm 모바일 플랫폼 사용자에게 이번 버전으로의 업데이트를 강력히 추천합니다.
또한 몇 달 동안 발생해오던 “bad transaction log” 예외를 야기하는 버그를 수정했습니다.
Swift 2 지원 중단
레거시 Swift 버전을 지원하는 데에는 많은 노력이 듭니다 😅. Swift 2.x 대의 활성 Realm 빌더가 5% 미만이며 Swift 2.x을 유지하는데 많은 비용이 들기 때문에 이번 버전부터 Swift 2.x 지원이 중단됩니다.
Realm Swift 2.3.0 버전이 Swift 2.x를 지원하는 마지막 버전입니다. 불편을 끼쳐 드려 죄송합니다.
Xcode 8.3 베타 1
최근 Apple은 Xcode 8.3 베타 버전을 발표했습니다. 이번 릴리즈에는 Realm Objective-C의 컴파일 문제를 수정한 변경 사항이 포함됩니다.
다만 아직 Swift 3.1 컴파일 문제는 해결을 위해 노력 중입니다. Xcode 8.3에서 사용하는 Realm Swift 문제에 대한 개선 사항이 궁금하다면 #4586에서 subscribe 버튼을 클릭해 주세요.
읽어 주셔서 감사합니다. Realm과 함께 멋진 앱을 만들어 보세요! Stack Overflow, GitHub, Facebook 그룹에서 언제든지 저희에게 연락할 수 있습니다!