Realm Blog

Realm ObjC & Swift 2.4: 객체 알림 기능 추가!

Realm Objective‑CRealm 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 인스턴스를 유지한 상태로, 콜백 내부에서 앱에 필요한 모든 업데이트를 처리합니다.

몇 가지 주의 사항이 있습니다. 리스트 속성이 변경된 경우, newValueoldValue 데이터를 볼 수는 없지만 알림은 계속 실행됩니다. 또한 동기적으로 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 그룹에서 언제든지 저희에게 연락할 수 있습니다!


Realm Team

Realm의 미션은 더 나은 앱을 빠르게 개발할 수 있도록 돕는 것입니다. 이를 위해 저희는 개발자들이 실시간 협업, 가상 현실, 라이브 데이터 동기화, 오프라인 경험, 메시징 등 정교하고 강력한 기능을 쉽게 개발할 수 있도록 하는 개발 도구와 플랫폼을 제공하고 있습니다.

저희는 모바일 인터넷이 수많은 사용자와 보다 많은 디바이스가 속한 개방형 네트워크와 이들 간의 실시간 상호 작용으로 진화할 것이라고 믿으며, 개발자가 이같은 방향으로 발전할 수 있도록 돕기 위해 저희 제품들을 개발하고 있습니다.

이런 개발 뉴스를 더 만나보세요