@@ -4,26 +4,40 @@ import QueryKit
4
4
import Foundation
5
5
6
6
7
+ private func managedObjectMatchesEntity( entityNames: [ String ] ) -> ( NSManagedObject ) -> Bool {
8
+ return { object in
9
+ if let name = object. entity. name {
10
+ return entityNames. contains ( name)
11
+ }
12
+
13
+ return false
14
+ }
15
+ }
16
+
17
+
7
18
/// Extension to QuerySet to provide observables
8
19
extension QuerySet {
20
+ private var entityNames : [ String ] {
21
+ if let entity = NSEntityDescription . entityForName ( entityName, inManagedObjectContext: context) {
22
+ return [ entityName] + entity. subentitiesByName. keys
23
+ }
24
+
25
+ return [ entityName]
26
+ }
27
+
9
28
/// Performs a query for all objects matching the set predicate ordered by any set sort descriptors.
10
29
/// Emits a value with an array of all objects when the managed object context is changed.
11
30
public func objects( ) throws -> Observable < [ ModelType ] > {
12
31
let initial = try self . array ( )
32
+ let filter = managedObjectMatchesEntity ( entityNames)
13
33
14
34
return Observable . create { observer in
15
35
observer. on ( . Next( initial) )
16
36
17
37
return self . context. qk_objectsDidChange ( ) . subscribeNext { notification in
18
- let insertedObjects = notification. insertedObjects. filter {
19
- $0. entity. name == self . entityName
20
- }
21
- let updatedObjects = notification. updatedObjects. filter {
22
- $0. entity. name == self . entityName
23
- }
24
- let deletedObjects = notification. deletedObjects. filter {
25
- $0. entity. name == self . entityName
26
- }
38
+ let insertedObjects = notification. insertedObjects. filter ( filter)
39
+ let updatedObjects = notification. updatedObjects. filter ( filter)
40
+ let deletedObjects = notification. deletedObjects. filter ( filter)
27
41
28
42
if insertedObjects. isEmpty && updatedObjects. isEmpty && deletedObjects. isEmpty {
29
43
return
@@ -43,14 +57,13 @@ extension QuerySet {
43
57
/// Emits an Int containing the amount of objects matching the predicate and updates when the managed object context is changed.
44
58
public func count( ) throws -> Observable < Int > {
45
59
var count : Int = try self . count ( )
60
+ let filter = managedObjectMatchesEntity ( entityNames)
46
61
47
62
return Observable . create { observer in
48
63
observer. on ( . Next( count) )
49
64
50
65
return self . context. qk_objectsDidChange ( ) . subscribeNext { notification in
51
- let updatedObjects = notification. updatedObjects. filter {
52
- $0. entity. name == self . entityName
53
- }
66
+ let updatedObjects = notification. updatedObjects. filter ( filter)
54
67
55
68
if !updatedObjects. isEmpty && self . predicate != nil {
56
69
do {
@@ -62,12 +75,8 @@ extension QuerySet {
62
75
return
63
76
}
64
77
65
- let insertedObjects = notification. insertedObjects. filter {
66
- $0. entity. name == self . entityName
67
- }
68
- let deletedObjects = notification. deletedObjects. filter {
69
- $0. entity. name == self . entityName
70
- }
78
+ let insertedObjects = notification. insertedObjects. filter ( filter)
79
+ let deletedObjects = notification. deletedObjects. filter ( filter)
71
80
72
81
var delta = 0
73
82
0 commit comments