Instantly share code, notes, and snippets.

Embed
What would you like to do?
turn Realm auto-updating Results into an RxSwift Observable sequence
//
// Results+Rx.swift
//
// Make Realm auto-updating Results observable. Works with Realm 0.98 and later, RxSwift 2.1.0 and later.
//
// Created by Florent Pillet on 12/02/16.
// Copyright (c) 2016 Florent Pillet. All rights reserved.
//
import Foundation
import RealmSwift
import RxSwift
extension Results {
/// turn a Realm Results into an Observable sequence that sends the Results object itself once at query, then
/// again every time a change occurs in the Results. Caller just subscribes to the observable to get
/// updates. Note that Realm may send updates even when there is no actual change to the data
/// (Realm docs mention they will fine tune this later)
func asObservable() -> Observable<Results<Element>> {
return Observable.create { observer in
var token: NotificationToken? = nil
token = self.addNotificationBlock { (results, error) in
guard error == nil else {
observer.onError(error!)
return
}
observer.onNext(results!)
}
return AnonymousDisposable {
token?.stop()
}
}
}
/// turn a Realm Results into an Observable sequence that sends the Results object itself once at query, then
/// again every time a change occurs in the Results. Caller just subscribes to the observable to get
/// updates. Note that Realm may send updates even when there is no actual change to the data
/// (Realm docs mention they will fine tune this later)
func asObservableArray() -> Observable<[Element]> {
return Observable.create { observer in
var token: NotificationToken? = nil
token = self.addNotificationBlock { (results, error) in
guard error == nil else {
observer.onError(error!)
return
}
observer.onNext(Array(self))
}
return AnonymousDisposable {
token?.stop()
}
}
}
}
@phamquochoan

This comment has been minimized.

Show comment
Hide comment
@phamquochoan

phamquochoan Feb 27, 2016

do we need to add [unowned self] or [weak self] into these functions ?

phamquochoan commented Feb 27, 2016

do we need to add [unowned self] or [weak self] into these functions ?

@fpillet

This comment has been minimized.

Show comment
Hide comment
@fpillet

fpillet Apr 17, 2016

@phamquochoan: I don't think so. In the second API you're right that we're using self in the closure so essentially keeping it alive -- but this is what we want! As long as we keep observing the Results, they will stay alive. It's when we dispose our subscription that we don't need Results anymore.

Owner

fpillet commented Apr 17, 2016

@phamquochoan: I don't think so. In the second API you're right that we're using self in the closure so essentially keeping it alive -- but this is what we want! As long as we keep observing the Results, they will stay alive. It's when we dispose our subscription that we don't need Results anymore.

@timbodeit

This comment has been minimized.

Show comment
Hide comment
@timbodeit

timbodeit Jun 21, 2016

Would be awesome to have this as a Cocoapod.

timbodeit commented Jun 21, 2016

Would be awesome to have this as a Cocoapod.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment