변경 사항에 대응 - .NET SDK
이 페이지의 내용
모든 Realm 객체는 라이브 객체 이므로 수정될 때마다 자동으로 업데이트 됩니다. Realm 은 속성 이 변경될 때마다 알림 이벤트 를 발생시킵니다.
Realm의 알림 시스템을 사용하면 변경을 일으킨 쓰기가 무엇이든 데이터의 변경 사항을 관찰하고 React 수 있습니다. 변경 사항을 관찰하려면 관찰하려는 Realm, 관리되는 컬렉션 또는 Realm 객체에 대한 알림 핸들러를 만듭니다. 그런 다음 변경 사항과 관련된 특정 앱 로직을 추가할 수 있습니다.
참고
프로젝트의 UI에 데이터 변경 사항을 바인딩하는 방법에 대한 자세한 내용은 데이터 바인딩을 참조하세요.
Realm은 세 가지 종류의 알림을 내보냅니다.
참고
알림은 영역 이 정기적으로 새로 고쳐질 때만 작동합니다. 애플리케이션 의 메인 또는 UI 스레드에서 영역 새로고침이 자동으로 발생합니다. 배경 스레드에서는 Realm .Refresh() 처리하다 호출하거나 SynchronizationContext 영역 을 열기 전에 스레드에서 . 타사 라이브러리인 Nito.AsyncEx.Context SynchronizationContext
구현 과 이를 설치할 수 있는 편리한 API 를 제공합니다.
Realm 변경 리스너 등록
전체 Realm에서 알림 핸들러를 등록할 수 있습니다. Realm은 해당 영역의 쓰기 트랜잭션(write transaction)이 커밋될 때마다 알림 핸들러를 호출합니다.
핸들러는 변경 사항에 대한 구체적인 정보를 수신하지 않습니다. 이는 변경 사항이 있는지 알고 싶지만 어떤 변경 사항이 발생했는지 구체적으로 알 필요가 없는 경우에 유용합니다.
실시간 협업 앱을 빌드하고 변경이 있을 때마다 증가하는 카운터를 갖고 싶다고 가정해 보겠습니다. 이 시나리오에서는 영역 알림 핸들러를 구독하고 표시기를 제어하는 코드를 추가할 수 있습니다.
// Observe realm notifications. realm.RealmChanged += (sender, eventArgs) => { // The "sender" object is the realm that has changed. // "eventArgs" is reserved for future use. // ... update UI ... };
collection 변경 사항 확인
Realm 객체 컬렉션과 객체의 Realm 컬렉션 속성에 대한 변경 사항을 감시할 수 있습니다. 컬렉션 변경 사항에 대한 알림을 받는 방법에는 컬렉션에 알림 핸들러를 등록하거나 CollectionChanged 를 처리하는 두 가지 방법이 있습니다. 이벤트.
Realm 내의 특정 컬렉션에 알림 핸들러를 등록할 수 있습니다. 컬렉션은 Realm 객체(예: realm.All<Person>()
) 또는 Realm 객체의 컬렉션 속성(예: house.Owners
, 'Owners' 유형 IList
)으로 구성될 수 있습니다.
핸들러는 마지막 알림 이후 collection의 변경 사항에 대한 설명을 수신합니다. Realm 전체 알림과 달리 컬렉션 알림에는 변경 사항에 대한 자세한 정보가 포함되어 있으며 UI에서 컬렉션을 나타내는 목록 또는 기타 보기를 관리하는 데 필요한 정보를 제공합니다.
구독이 추가되면 Realm에서 초기 알림을 보냅니다. 초기 알림 후 Realm은 쓰기 트랜잭션(write transaction)이 컬렉션에서 객체를 추가, 수정 또는 제거할 때마다 비동기적으로 알림을 전달합니다.
알림 ChangeSets
알림에는 6 속성이 있는 ChangeSet 가 포함되어 있습니다.
DeletedIndices
삭제된 객체의 인덱스가 포함된int[]
입니다.InsertedIndices
삽입된 객체의 인덱스를 포함하는int[]
입니다.ModifiedIndices
수정된 객체의 이전 인덱스를 포함하는int[]
입니다. 이러한 인덱스는 삭제 또는 삽입이 발생하기 전에 원본 collection에서 수정된 객체의 위치를 나타냅니다.NewModifiedIndices
ModifiedIndices
property와 동일한 항목을 나타내는int[]
이지만 인덱스는 모든 변경 사항이 고려된 후 collection의 새 위치를 나타냅니다.IsCleared
Clear()
메서드를 호출하여 collection이 지워진 경우 부울이true
로 설정됩니다.Moved
컬렉션 내에서 이동한 객체의 이전 인덱스와 새 인덱스를 포함하는 ChangeSet.Move 구조체의 배열입니다.
중요
알림 순서의 중요성
collection 알림 핸들러에서는 항상 다음과 같은 순서로 변경 사항을 적용하세요.
삭제
삽입
수정
삭제하기 전에 삽입을 처리하면 예기치 않은 동작이 발생할 수 있습니다.
모든 컬렉션 변경 사항에 대한 알림 받기
컬렉션 알림을 구독하려면 SubscribeForNotifications 메서드를 호출합니다. SubscribeForNotifications
은(는) 언제든지 폐기하여 컬렉션에 대한 알림 수신을 중지할 수 있는 구독 토큰을 반환합니다.
다음 코드는 collection의 변경 사항을 관찰하는 방법을 보여줍니다.
// Watch for collection notifications. var subscriptionToken = realm.All<Dog>() .SubscribeForNotifications((sender, changes) => { if (changes == null) { // This is the case when the notification is called // for the first time. // Populate tableview/listview with all the items // from `collection` return; } // Handle individual changes foreach (var i in changes.DeletedIndices) { // ... handle deletions ... } foreach (var i in changes.InsertedIndices) { // ... handle insertions ... } foreach (var i in changes.NewModifiedIndices) { // ... handle modifications ... } if (changes.IsCleared) { // A special case if the collection has been cleared: // i.e., all items have been deleted by calling // the Clear() method. } });
제한 알림
SDK 는 trigger 알림을 할 필드를 필터하다 하는 방법을 제공하는 KeyPathsCollection 도 제공합니다. KeyPathsCollection
을 SubscribeForNotifications
메서드에 전달합니다. 다음 코드는 특정 필드를 관찰하는 방법을 보여줍니다.
var query = realm.All<Person>(); KeyPathsCollection kpc; // Use one of these equivalent declarations to // specify the fields you want to monitor for changes: kpc = KeyPathsCollection.Of("Email", "Name"); kpc = new List<KeyPath> {"Email", "Name"}; // To get all notifications for top-level properties // and 4 nested levels of properties, use the `Full` // static value: kpc = KeyPathsCollection.Full; // To receive notifications for changes to the // collection only and none of the properties, // use the `Shallow` static value: kpc = KeyPathsCollection.Shallow; query.SubscribeForNotifications(notificationCallback, kpc);
변경 리스너 등록 취소
변경 리스너의 등록을 취소하려면 토큰에서 Dispose
를 호출합니다. 다음 코드는 이를 수행하는 방법을 보여줍니다.
// Watch for collection notifications. // Call Dispose() when you are done observing the // collection. var token = realm.All<Dog>() .SubscribeForNotifications((sender, changes) => { // etc. }); // When you no longer want to receive notifications: token.Dispose();
CollectionChanged 이벤트 처리
모든 Realm 컬렉션은 데이터 바인딩 시나리오에서 컬렉션을 직접 사용할 수 있는 INotifyCollectionChanged
를 구현합니다. 컬렉션은 을 INotifyCollectionChanged
구현하므로 컬렉션 변경 사항을 모니터링하는 또 다른 방법은 CollectionChanged 를 처리하는 것입니다. 이벤트를 열고 NotifyCollectionChangedAction의 유형을 확인합니다.
중요
자세한 정보 축소
CollectionChanged
이벤트 핸들러는 SubscribeForNotifications
가 제공하는 것과 같은 변경 사항에 대한 세부 정보를 제공하지 않습니다.
다음 코드는 CollectionChanged
이벤트 핸들러를 구현하는 방법을 보여줍니다.
{ // Subscribe to a query realm.All<Dog>().AsRealmCollection().CollectionChanged += HandleCollectionChanged; // Subscribe to a property collection gracie.Owners.AsRealmCollection().CollectionChanged += HandleCollectionChanged; ... } private void HandleCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { // Use e.Action to get the // NotifyCollectionChangedAction type. if (e.Action == NotifyCollectionChangedAction.Add) { // etc. } }
객체 변경 리스너 등록
영역 내의 특정 객체에 대한 알림 핸들러를 등록하여 객체의 속성이 변경될 때 SDK가 알려주도록 할 수 있습니다. 핸들러는 변경된 필드에 대한 정보를 수신합니다. 필드 이름을 사용하면 새 값을 얻을 수 있습니다.
다음 코드는 객체의 변경 사항을 관찰하는 방법을 보여줍니다.
var artist = realm.All<Person>() .FirstOrDefault(p => p.Name == "Elvis Presley"); artist.PropertyChanged += (sender, eventArgs) => { var changedProperty = eventArgs.PropertyName!; Debug.WriteLine( $@"New value set for 'artist': '{changedProperty}' is now {artist.GetType() .GetProperty(changedProperty).GetValue(artist)}"); }; realm.Write(() => { artist.Name = "Elvis Costello"; }); realm.Refresh(); }
변경 리스너 등록 취소
변경 리스너에서 더 이상 알림을 받고 싶지 않은 경우 핸들러 등록을 취소합니다. 이 코드는 Realm 객체 컬렉션과 컬렉션 속성 모두에 대해 동일합니다. 다음 코드는 두 가지 모두에서 변경 리스너 등록을 취소하는 방법을 보여줍니다.
// Unsubscribe from notifications on a // realm listener realm.RealmChanged -= OnRealmChanged; // Unsubscribe from notifications on a // collection of realm objects realm.All<Item>().AsRealmCollection() .CollectionChanged -= OnItemsChangedHandler; // Unsubscribe from notifications on a // collection property items.AsRealmCollection().CollectionChanged -= OnItemsChangedHandler;
알림 한도 변경
중첩된 문서의 변경 내용이 4단계 아래로 내려가면 변경 알림이 트리거되지 않습니다.
5단계 아래 또는 그 이상의 변경 사항을 수신해야 하는 데이터 구조가 있는 경우 해결 방법은 다음과 같습니다.
스키마를 리팩터링하여 중첩을 줄입니다.
사용자가 수동으로 데이터를 새로 고칠 수 있도록 '푸시하여 새로 고침'과 같은 내용을 추가합니다.