Using Realm Notifications in .Net

There is a documentation on Realm.io, that describes how to hook up on a ROS (Realm Object Server) to observe changes on specific Realms, RealmObjects or whole instances. So there is no need to actually download the whole Realm, since it “sees” the changes directly on the server. It is also pretty cool, that you don’t have to load the assemblies that contain the correct RealmObjects (and version), because it uses the .Net DynamicObject feature.

https://docs.realm.io/sync/backend-integration/data-change-events#integrating-with-a-3rd-party-api

Sadly, this only works with node.js not in .Net…

There is currently only one work around, that really works with .Net Standard, that I have found. You open the specific Realm in dynamic mode and use the method SubscribeForNotifications. Be sure to have a separate Thread running for the notifications to work properly.

static async Task Main(string[] args)
{
var adminUser = await User.LoginAsync(Credentials.UsernamePassword("aUser", "****", false), new Uri("https://rosurl"));
var realmSyncConfig = new Realms.Sync.FullSyncConfiguration(
new Uri("SomeRealm", UriKind.Relative), adminUser);
realmSyncConfig.IsDynamic = true;
Nito.AsyncEx.AsyncContext.Run(async () =>
{
var realm = await Realm.GetInstanceAsync(realmSyncConfig);
var realmCollection = realm.All("Organization") as RealmCollectionBase<RealmObject>;
var token = realmCollection.SubscribeForNotifications(RealmChanged);

while (true)
{
// you can use a cancellation token here
await Task.Delay(1000);
}
token.Dispose();
realm.Dispose();
});
Console.ReadLine();
}

private static void RealmChanged(IRealmCollection<RealmObject> sender, ChangeSet changes, Exception error)
{
/* here you can handle changes */
}

There are some disadvantages when you use this solution:
1. The Realm that you want to subscribe changes on will be fully synced. (So it’s not a good solution for very large Realms)
2. You can’t just watch your whole instance, you need to actually know the full name of your Realm

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.