From 9bfca130f1de055841d3a88899554c8eacd840ee Mon Sep 17 00:00:00 2001 From: k-lpmg Date: Mon, 30 Jul 2018 14:16:35 +0900 Subject: [PATCH] Fix completion of transaction --- Sources/RealmManageable.swift | 34 +++++++++++++++---------------- Sources/RealmProxiable.swift | 2 +- Tests/RealmTransactionTests.swift | 18 ++++++++++------ 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/Sources/RealmManageable.swift b/Sources/RealmManageable.swift index a4e1fcb..f3ea2c6 100644 --- a/Sources/RealmManageable.swift +++ b/Sources/RealmManageable.swift @@ -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 @@ -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 @@ -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) @@ -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) } } diff --git a/Sources/RealmProxiable.swift b/Sources/RealmProxiable.swift index 16d7b85..8bda0eb 100644 --- a/Sources/RealmProxiable.swift +++ b/Sources/RealmProxiable.swift @@ -11,7 +11,7 @@ public extension RealmProxiable { } func query(_ type: T.Type = T.self, filter: String? = nil, sortProperty: String? = nil, ordering: OrderingType = .ascending) -> RealmQuery { - 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) diff --git a/Tests/RealmTransactionTests.swift b/Tests/RealmTransactionTests.swift index 469cc59..7e350ee 100644 --- a/Tests/RealmTransactionTests.swift +++ b/Tests/RealmTransactionTests.swift @@ -26,10 +26,13 @@ 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() } @@ -37,7 +40,7 @@ class RealmTransactionTests: XCTestCase { } 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) @@ -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() }