Skip to content

Commit

Permalink
Fix completion of transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
k-lpmg committed Jul 30, 2018
1 parent 793563e commit 9bfca13
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 24 deletions.
34 changes: 17 additions & 17 deletions Sources/RealmManageable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import RealmSwift
import Realm.Private

public typealias RealmWriteHandler = (Realm) -> Void
public typealias RealmCompletionHandler = (Realm?, Error?) -> Void

public enum OrderingType {
case ascending, descending
Expand Down Expand Up @@ -71,15 +72,15 @@ public extension RealmManageable {

// MARK: - Internal methods

func clear(dispatchQueue: DispatchQueue = Self.defaultQueue, isSync: Bool = true, completion: (() -> Void)? = nil) {
transaction(dispatchQueue: dispatchQueue, isSync: isSync, writeHandler: { (realm) in
func clear(writeQueue: DispatchQueue = Self.defaultQueue, isSync: Bool = true, completion: RealmCompletionHandler? = nil) {
transaction(writeQueue: writeQueue, isSync: isSync, writeHandler: { (realm) in
realm.deleteAll()
}) {
completion?()
}) { (realm, error) in
completion?(realm, error)
}
}

func configuration() -> Realm.Configuration {
func createConfiguration() -> Realm.Configuration {
var config = Realm.Configuration()
config.schemaVersion = schemaVersion
config.migrationBlock = migrationBlock
Expand All @@ -103,22 +104,24 @@ public extension RealmManageable {
return config
}

func transaction(dispatchQueue: DispatchQueue = Self.defaultQueue, isSync: Bool = true, writeHandler: @escaping RealmWriteHandler, completion: (() -> Void)? = nil) {
func transaction(writeQueue: DispatchQueue = Self.defaultQueue, isSync: Bool = true, writeHandler: @escaping RealmWriteHandler, completionQueue: DispatchQueue = DispatchQueue.main, completion: RealmCompletionHandler? = nil) {
guard isSync else {
dispatchQueue.async {
self.perform(realm: try! Realm(configuration: self.configuration()), writeHandler: writeHandler, completion: completion)
writeQueue.async {
self.perform(writeHandler: writeHandler, completionQueue: completionQueue, completion: completion)
}
return
}

dispatchQueue.sync {
perform(realm: try! Realm(configuration: configuration()), writeHandler: writeHandler, completion: completion)
writeQueue.sync {
perform(writeHandler: writeHandler, completionQueue: completionQueue, completion: completion)
}
}

// MARK: - Private methods

private func perform(realm: Realm, writeHandler: @escaping RealmWriteHandler, completion: (() -> Void)? = nil) {
private func perform(writeHandler: @escaping RealmWriteHandler, completionQueue: DispatchQueue, completion: RealmCompletionHandler?) {
let configuration = createConfiguration()
let realm = try! Realm(configuration: configuration)
do {
try realm.write {
writeHandler(realm)
Expand All @@ -127,12 +130,9 @@ public extension RealmManageable {
print("RealmManager not write to database: \(error)")
}

if Thread.isMainThread {
completion?()
} else {
DispatchQueue.main.async {
completion?()
}
Realm.asyncOpen(configuration: configuration, callbackQueue: completionQueue) { (realm, error) in
realm?.refresh()
completion?(realm, error)
}
}

Expand Down
2 changes: 1 addition & 1 deletion Sources/RealmProxiable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public extension RealmProxiable {
}

func query<T: Object>(_ type: T.Type = T.self, filter: String? = nil, sortProperty: String? = nil, ordering: OrderingType = .ascending) -> RealmQuery<T> {
let realm = try! Realm(configuration: realmManager().configuration())
let realm = try! Realm(configuration: realmManager().createConfiguration())
var results = realm.objects(type)
if let filter = filter {
results = results.filter(filter)
Expand Down
18 changes: 12 additions & 6 deletions Tests/RealmTransactionTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,21 @@ class RealmTransactionTests: XCTestCase {

UserRealmManager.shared.transaction(isSync: false, writeHandler: { (realm) in
self.addUser(count: self.userCount, realm: realm)
}) { (realm, error) in
XCTAssertNil(error)
XCTAssertNotNil(realm)

let users = realm.objects(User.self)
let users = realm!.objects(User.self)
XCTAssertEqual(users.count, self.userCount)
}) {
expectation.fulfill()
}

waitForExpectations(timeout: 60)
}

func testCustomSyncTransaction() {
UserRealmManager.shared.transaction(dispatchQueue: DispatchQueue(label: "testCustomSyncTransaction"), writeHandler: { (realm) in
UserRealmManager.shared.transaction(writeQueue: DispatchQueue(label: "testCustomSyncTransaction"), writeHandler: { (realm) in
self.addUser(count: self.userCount, realm: realm)

let users = realm.objects(User.self)
Expand All @@ -48,12 +51,15 @@ class RealmTransactionTests: XCTestCase {
func testCustomAsyncTransaction() {
let expectation = self.expectation(description: "testCreateNotification")

UserRealmManager.shared.transaction(dispatchQueue: DispatchQueue(label: "testCustomAsyncTransaction"), isSync: false, writeHandler: { (realm) in
UserRealmManager.shared.transaction(writeQueue: DispatchQueue(label: "testCustomAsyncTransaction"), isSync: false, writeHandler: { (realm) in
self.addUser(count: self.userCount, realm: realm)
}) { (realm, error) in
XCTAssertNil(error)
XCTAssertNotNil(realm)

let users = realm.objects(User.self)
let users = realm!.objects(User.self)
XCTAssertEqual(users.count, self.userCount)
}) {
expectation.fulfill()
}

Expand Down

0 comments on commit 9bfca13

Please sign in to comment.