Skip to content

Commit 1f5374d

Browse files
committed
Fix realm observable
1 parent da8faaf commit 1f5374d

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

DBClient/Realm/RealmDBClient.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ extension RealmDBClient: DBClient {
117117
}
118118

119119
public func observable<T: Stored>(for request: FetchRequest<T>) -> RequestObservable<T>{
120-
// return RealmObservable(request: request, realm: realm)
121-
return RequestObservable(request: request)
120+
return RealmObservable(request: request, realm: realm)
122121
}
123122

124123
}
@@ -147,4 +146,5 @@ extension Results {
147146

148147
return l
149148
}
149+
150150
}

DBClient/Realm/RealmObservable.swift

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import RealmSwift
1111

1212
extension Object: Stored {}
1313

14-
public class RealmObservable<T: Object>: RequestObservable<T> {
14+
public class RealmObservable<T: Stored>: RequestObservable<T> {
1515

1616
internal let realm: Realm
1717
internal var notificationToken: NotificationToken?
@@ -24,37 +24,38 @@ public class RealmObservable<T: Object>: RequestObservable<T> {
2424
open override func observe(_ closure: @escaping (ObservableChange<T>) -> Void) {
2525
precondition(notificationToken == nil, "Observable can be observed only once")
2626

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())
2832
if let predicate = request.predicate {
2933
realmObjects = realmObjects.filter(predicate)
3034
}
3135
if let sortDescriptor = request.sortDescriptor, let key = sortDescriptor.key {
3236
realmObjects = realmObjects.sorted(byProperty: key, ascending: sortDescriptor.ascending)
3337
}
3438

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+
}
3754
}
3855
}
3956

4057
public func stopObserving() {
4158
notificationToken = nil
4259
}
4360

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-
6061
}

0 commit comments

Comments
 (0)