Skip to content

Commit dd7cc52

Browse files
authored
Merge pull request #47 from RxSwiftCommunity/mt-single-object-fix
Mt single object fix
2 parents 202d9ab + bc89973 commit dd7cc52

File tree

5 files changed

+68
-66
lines changed

5 files changed

+68
-66
lines changed

Example/Podfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ target 'RxRealm_Example' do
66
pod 'RxRealm', :path => '../'
77
pod 'RxSwift', '~> 3.0.0'
88
pod 'RxCocoa', '~> 3.0.0'
9-
pod 'RealmSwift', '~> 2.0'
9+
pod 'RealmSwift', '~> 2.1'
1010
end
1111

1212
target 'RxRealm_Tests' do
1313
platform :ios, '8.0'
1414
pod 'RxTest', '~> 3.0.0'
15-
pod 'RealmSwift', '~> 2.0'
15+
pod 'RealmSwift', '~> 2.1'
1616
pod 'RxRealm', :path => '../'
1717
end
1818

Example/RxRealm.xcodeproj/project.pbxproj

+6
Original file line numberDiff line numberDiff line change
@@ -229,10 +229,12 @@
229229
TargetAttributes = {
230230
607FACCF1AFB9204008FA782 = {
231231
CreatedOnToolsVersion = 6.3.1;
232+
DevelopmentTeam = 9MF8G8D9Y5;
232233
LastSwiftMigration = 0800;
233234
};
234235
9CEB7A461CC834340077C44D = {
235236
CreatedOnToolsVersion = 7.3;
237+
DevelopmentTeam = 9MF8G8D9Y5;
236238
LastSwiftMigration = 0800;
237239
};
238240
};
@@ -517,6 +519,7 @@
517519
buildSettings = {
518520
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
519521
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
522+
DEVELOPMENT_TEAM = 9MF8G8D9Y5;
520523
FRAMEWORK_SEARCH_PATHS = (
521524
"$(inherited)",
522525
"\"$PODS_CONFIGURATION_BUILD_DIR/Realm\"",
@@ -541,6 +544,7 @@
541544
buildSettings = {
542545
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
543546
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
547+
DEVELOPMENT_TEAM = 9MF8G8D9Y5;
544548
FRAMEWORK_SEARCH_PATHS = (
545549
"$(inherited)",
546550
"\"$PODS_CONFIGURATION_BUILD_DIR/Realm\"",
@@ -566,6 +570,7 @@
566570
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
567571
CLANG_ANALYZER_NONNULL = YES;
568572
DEBUG_INFORMATION_FORMAT = dwarf;
573+
DEVELOPMENT_TEAM = 9MF8G8D9Y5;
569574
INFOPLIST_FILE = RxRealm_Tests/Info.plist;
570575
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
571576
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
@@ -581,6 +586,7 @@
581586
buildSettings = {
582587
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
583588
CLANG_ANALYZER_NONNULL = YES;
589+
DEVELOPMENT_TEAM = 9MF8G8D9Y5;
584590
INFOPLIST_FILE = RxRealm_Tests/Info.plist;
585591
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
586592
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";

Example/RxRealm_Tests/RxRealmTests.swift

+16-23
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ class RxRealm_Tests: XCTestCase {
4141
}
4242

4343
func testEmittedResultsValues() {
44-
let expectation1 = expectation(description: "Results<Message> first")
45-
let expectation2 = expectation(description: "Results<Message> second")
46-
44+
let expectation1 = expectation(description: "Results<Message>")
45+
4746
let realm = realmInMemory(#function)
4847
clearRealm(realm)
4948
let bag = DisposeBag()
@@ -52,11 +51,9 @@ class RxRealm_Tests: XCTestCase {
5251
let observer = scheduler.createObserver(Results<Message>.self)
5352

5453
let messages$ = Observable.from(realm.objects(Message.self)).shareReplay(1)
55-
messages$.subscribe(onNext: {messages in
56-
switch messages.count {
57-
case 1: expectation1.fulfill()
58-
case 2: expectation2.fulfill()
59-
default: XCTFail("Unexpected value emitted by Observable")
54+
messages$.subscribe(onNext: {
55+
if $0.count == 2 {
56+
expectation1.fulfill()
6057
}
6158
}).addDisposableTo(bag)
6259

@@ -71,18 +68,17 @@ class RxRealm_Tests: XCTestCase {
7168
scheduler.start()
7269

7370
waitForExpectations(timeout: 0.5) {error in
74-
XCTAssertTrue(error == nil)
75-
XCTAssertEqual(observer.events.count, 2)
71+
XCTAssertNil(error, "Error: \(error?.localizedDescription)")
72+
XCTAssertTrue(observer.events.count > 0)
7673
let results = observer.events.last!.value.element!
7774
XCTAssertTrue(results.first! == Message("first(Results)"))
7875
XCTAssertTrue(results.last! == Message("second(Results)"))
7976
}
8077
}
8178

8279
func testEmittedArrayValues() {
83-
let expectation1 = expectation(description: "Array<Message> first")
84-
let expectation2 = expectation(description: "Array<Message> second")
85-
80+
let expectation1 = expectation(description: "Array<Message> expectation")
81+
8682
let realm = realmInMemory(#function)
8783
clearRealm(realm)
8884
let bag = DisposeBag()
@@ -91,11 +87,9 @@ class RxRealm_Tests: XCTestCase {
9187
let observer = scheduler.createObserver(Array<Message>.self)
9288

9389
let messages$ = Observable.arrayFrom(realm.objects(Message.self)).shareReplay(1)
94-
messages$.subscribe(onNext: {messages in
95-
switch messages.count {
96-
case 1: expectation1.fulfill()
97-
case 2: expectation2.fulfill()
98-
default: XCTFail("Unexpected value emitted by Observable")
90+
messages$.subscribe(onNext: {
91+
if $0.count == 2 {
92+
expectation1.fulfill()
9993
}
10094
}).addDisposableTo(bag)
10195

@@ -110,11 +104,10 @@ class RxRealm_Tests: XCTestCase {
110104
scheduler.start()
111105

112106
waitForExpectations(timeout: 0.5) {error in
113-
XCTAssertTrue(error == nil)
114-
XCTAssertEqual(observer.events.count, 2)
115-
116-
XCTAssertTrue(observer.events[0].value.element!.equalTo([Message("first(Array)")]))
117-
XCTAssertTrue(observer.events[1].value.element!.equalTo([Message("first(Array)"), Message("second(Array)")]))
107+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
108+
XCTAssertTrue(observer.events.count > 0)
109+
XCTAssertTrue(observer.events[observer.events.count-2].value.element!.equalTo([Message("first(Array)")]))
110+
XCTAssertTrue(observer.events[observer.events.count-1].value.element!.equalTo([Message("first(Array)"), Message("second(Array)")]))
118111
}
119112
}
120113

Example/RxRealm_Tests/RxRealmWriteSinks.swift

+34-35
Original file line numberDiff line numberDiff line change
@@ -40,32 +40,30 @@ class RxRealmWriteSinks: XCTestCase {
4040
let observer = scheduler.createObserver(Array<Message>.self)
4141
let observable = scheduler.createHotObservable(events).asObservable()
4242
let messages$ = Observable.arrayFrom(realm.objects(Message.self)).shareReplay(1)
43-
44-
43+
4544
messages$.subscribe(observer)
4645
.addDisposableTo(bag)
4746

48-
messages$.subscribe(onNext: {
49-
switch $0.count {
50-
case 1:
51-
expectation.fulfill()
52-
default:
53-
break
54-
}
55-
}).addDisposableTo(bag)
47+
messages$
48+
.subscribe(onNext: { messages in
49+
if messages.count == 1 {
50+
expectation.fulfill()
51+
}
52+
})
53+
.addDisposableTo(bag)
5654

5755
observable
5856
.subscribe(rx_add)
5957
.addDisposableTo(bag)
6058

6159
scheduler.start()
6260

63-
waitForExpectations(timeout: 0.1, handler: nil)
64-
65-
66-
XCTAssertEqual(observer.events.count, 1)
67-
XCTAssertEqual(observer.events[0].time, 0)
68-
XCTAssertTrue(observer.events[0].value.element!.equalTo([Message("1")]))
61+
waitForExpectations(timeout: 1, handler: {error in
62+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
63+
XCTAssertTrue(observer.events.count > 0)
64+
XCTAssertEqual(observer.events.last!.time, 0)
65+
XCTAssertTrue(observer.events.last!.value.element!.equalTo([Message("1")]))
66+
})
6967
}
7068

7169
func testRxAddObjects() {
@@ -90,21 +88,19 @@ class RxRealmWriteSinks: XCTestCase {
9088
.addDisposableTo(bag)
9189

9290
messages$.subscribe(onNext: {
93-
switch $0.count {
94-
case 2:
91+
if $0.count == 2 {
9592
expectation.fulfill()
96-
default:
97-
break
9893
}
9994
}).addDisposableTo(bag)
10095

10196
scheduler.start()
10297

103-
waitForExpectations(timeout: 0.1, handler: nil)
104-
105-
XCTAssertEqual(observer.events.count, 1)
106-
XCTAssertEqual(observer.events[0].time, 0)
107-
XCTAssertTrue(observer.events[0].value.element!.equalTo([Message("1"), Message("2")]))
98+
waitForExpectations(timeout: 0.1, handler: {error in
99+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
100+
XCTAssertTrue(observer.events.count > 0)
101+
XCTAssertEqual(observer.events.last!.time, 0)
102+
XCTAssertTrue(observer.events.last!.value.element!.equalTo([Message("1"), Message("2")]))
103+
})
108104
}
109105

110106
func testRxAddUpdateObjects() {
@@ -141,6 +137,7 @@ class RxRealmWriteSinks: XCTestCase {
141137
scheduler.start()
142138

143139
waitForExpectations(timeout: 5, handler: {error in
140+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
144141
//check that UniqueObject with id == 1 was overwritten
145142
XCTAssertTrue(observer.events.last!.value.element!.count == 3)
146143
XCTAssertTrue(observer.events.last!.value.element![0] == UniqueObject(1))
@@ -187,11 +184,12 @@ class RxRealmWriteSinks: XCTestCase {
187184

188185
scheduler.start()
189186

190-
waitForExpectations(timeout: 0.1, handler: nil)
191-
192-
XCTAssertEqual(observer.events.count, 1)
193-
XCTAssertEqual(observer.events[0].time, 0)
194-
XCTAssertEqual(observer.events[0].value.element!, [Message]())
187+
waitForExpectations(timeout: 0.1, handler: {error in
188+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
189+
XCTAssertTrue(observer.events.count > 0)
190+
XCTAssertEqual(observer.events.last!.time, 0)
191+
XCTAssertEqual(observer.events.last!.value.element!, [Message]())
192+
})
195193
}
196194

197195
func testRxDeleteItems() {
@@ -230,11 +228,12 @@ class RxRealmWriteSinks: XCTestCase {
230228

231229
scheduler.start()
232230

233-
waitForExpectations(timeout: 0.1, handler: nil)
234-
235-
XCTAssertEqual(observer.events.count, 1)
236-
XCTAssertEqual(observer.events[0].time, 0)
237-
XCTAssertTrue(observer.events[0].value.element!.isEmpty)
231+
waitForExpectations(timeout: 0.1, handler: {error in
232+
XCTAssertNil(error, "Error: \(error!.localizedDescription)")
233+
XCTAssertTrue(observer.events.count > 0)
234+
XCTAssertEqual(observer.events.last!.time, 0)
235+
XCTAssertTrue(observer.events.last!.value.element!.isEmpty)
236+
})
238237
}
239238

240239
func testRxAddObjectsInBg() {

Pod/Classes/RxRealm.swift

+10-6
Original file line numberDiff line numberDiff line change
@@ -334,20 +334,24 @@ extension Reactive where Base: Realm {
334334

335335
//MARK: Realm Object type extensions
336336

337-
public extension ObservableType where E: Object {
337+
public extension Observable where Element: Object {
338338

339-
public static func from(_ object: E) -> Observable<E> {
339+
// until there is a built-in solution from Realm to observe a single object
340+
// this handy method observes a single object by its primary key
341+
342+
public static func from(_ object: Element) -> Observable<Element> {
340343

341344
guard let realm = object.realm else {
342-
return Observable<E>.empty()
345+
return Observable<Element>.empty()
343346
}
344-
guard let primaryKeyName = type(of: object).primaryKey(),
347+
348+
guard let primaryKeyName = Element.primaryKey(),
345349
let primaryKey = object.value(forKey: primaryKeyName) else {
346350
fatalError("At present you can't observe objects that don't have primary key.")
347351
}
348352

349-
return Observable<E>.create {observer in
350-
let objectQuery = realm.objects(type(of: object))
353+
return Observable<Element>.create {observer in
354+
let objectQuery = realm.objects(Element)
351355
.filter("%K == %@", primaryKeyName, primaryKey)
352356

353357
let token = objectQuery.addNotificationBlock {changes in

0 commit comments

Comments
 (0)