Skip to content

Commit 16431af

Browse files
committed
[Count] Don't update when nothing changes
1 parent 34b1481 commit 16431af

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

RxQueryKit/RxQueryKit.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ extension QuerySet {
1717
/// Performs a query for the count of all objects matching the set predicate.
1818
/// Emits an Int containing the amount of objects matching the predicate and updates when the managed object context is changed.
1919
public func count() throws -> Observable<Int> {
20-
var count:Int = try self.count()
20+
var count: Int = try self.count()
2121

2222
return Observable.create { observer in
2323
observer.on(.Next(count))
@@ -30,15 +30,20 @@ extension QuerySet {
3030
$0.entity.name == self.entityName
3131
}
3232

33+
var delta = 0
34+
3335
if let predicate = self.predicate {
34-
count += (insertedObjects as NSArray).filteredArrayUsingPredicate(predicate).count
35-
count -= (deletedObjects as NSArray).filteredArrayUsingPredicate(predicate).count
36+
delta += (insertedObjects as NSArray).filteredArrayUsingPredicate(predicate).count
37+
delta -= (deletedObjects as NSArray).filteredArrayUsingPredicate(predicate).count
3638
} else {
37-
count += insertedObjects.count
38-
count -= deletedObjects.count
39+
delta += insertedObjects.count
40+
delta -= deletedObjects.count
3941
}
4042

41-
observer.on(.Next(count))
43+
if delta != 0 {
44+
count += delta
45+
observer.on(.Next(count))
46+
}
4247
}
4348
}
4449
}

RxQueryKitTests/RxQueryKitTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ class RxQueryKitTests: XCTestCase {
4545
try! context.save()
4646
XCTAssertEqual(counts, [0, 3, 1])
4747

48+
// Doesn't update when nothing changes
49+
Comment.create(context, text: "Hello World")
50+
try! context.save()
51+
XCTAssertEqual(counts, [0, 3, 1])
52+
4853
disposable.dispose()
4954
}
5055
}
@@ -88,8 +93,16 @@ class RxQueryKitTests: XCTestCase {
8893
let entity = NSEntityDescription()
8994
entity.name = "Comment"
9095
entity.managedObjectClassName = "Comment"
96+
entity.properties = [text]
9197
return entity
9298
}
9399

100+
class func create(context: NSManagedObjectContext, text: String) -> Comment {
101+
let entity = NSEntityDescription.entityForName("Comment", inManagedObjectContext: context)!
102+
let comment = Comment(entity: entity, insertIntoManagedObjectContext: context)
103+
comment.text = text
104+
return comment
105+
}
106+
94107
@NSManaged var text: String
95108
}

0 commit comments

Comments
 (0)