@@ -11,7 +11,7 @@ import RealmSwift
11
11
12
12
extension Object : Stored { }
13
13
14
- public class RealmObservable < T: Object > : RequestObservable < T > {
14
+ public class RealmObservable < T: Stored > : RequestObservable < T > {
15
15
16
16
internal let realm : Realm
17
17
internal var notificationToken : NotificationToken ?
@@ -24,37 +24,38 @@ public class RealmObservable<T: Object>: RequestObservable<T> {
24
24
open override func observe( _ closure: @escaping ( ObservableChange < T > ) -> Void ) {
25
25
precondition ( notificationToken == nil , " Observable can be observed only once " )
26
26
27
- var realmObjects = realm. objects ( T . self)
27
+ guard let realmModelType = T . self as? RealmModelConvertible . Type else {
28
+ fatalError ( " RealmDBClient can manage only types which conform to RealmModelConvertible " )
29
+ }
30
+
31
+ var realmObjects = realm. objects ( realmModelType. realmClass ( ) )
28
32
if let predicate = request. predicate {
29
33
realmObjects = realmObjects. filter ( predicate)
30
34
}
31
35
if let sortDescriptor = request. sortDescriptor, let key = sortDescriptor. key {
32
36
realmObjects = realmObjects. sorted ( byProperty: key, ascending: sortDescriptor. ascending)
33
37
}
34
38
35
- notificationToken = realmObjects. addNotificationBlock { [ unowned self] changes in
36
- closure ( self . map ( changes) )
39
+ notificationToken = realmObjects. addNotificationBlock { changes in
40
+ switch changes {
41
+ case . initial( let initial) :
42
+ let mapped = initial. map { realmModelType. from ( $0) as! T }
43
+ closure ( . initial( Array ( mapped) ) )
44
+
45
+ case . update( let objects, let deletions, let insertions, let modifications) :
46
+ let mappedObjects = objects. map { realmModelType. from ( $0) as! T }
47
+ let insertions = insertions. map { ( index: $0, element: mappedObjects [ $0] ) }
48
+ let modifications = modifications. map { ( index: $0, element: mappedObjects [ $0] ) }
49
+ closure ( . update( deletions: deletions, insertions: insertions, modifications: modifications) )
50
+
51
+ case . error( let error) :
52
+ closure ( . error( error) )
53
+ }
37
54
}
38
55
}
39
56
40
57
public func stopObserving( ) {
41
58
notificationToken = nil
42
59
}
43
60
44
- fileprivate func map( _ realmChange: RealmCollectionChange < Results < T > > ) -> ObservableChange < T > {
45
- switch realmChange {
46
- case . initial( let initial) :
47
- return . initial( Array ( initial) )
48
-
49
- case . update( let objects, let deletions, let insertions, let modifications) :
50
- let deletions = deletions. map { $0 }
51
- let insertions = insertions. map { ( index: $0, element: objects [ $0] ) }
52
- let modifications = modifications. map { ( index: $0, element: objects [ $0] ) }
53
- return . update( deletions: deletions, insertions: insertions, modifications: modifications)
54
-
55
- case . error( let error) :
56
- return . error( error)
57
- }
58
- }
59
-
60
61
}
0 commit comments