From 3f28198552a74fa6bf5e68eea9b8a4121f2cc282 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Fri, 9 Sep 2016 12:49:10 +0900 Subject: [PATCH] Magical NSFetchedResultsController bugfix.... --- CoreStoreDemo/CoreStoreDemo/AppDelegate.swift | 2 +- ...etchingAndQueryingDemoViewController.swift | 18 +-- .../QueryingResultsViewController.swift | 14 +- .../ListObserverDemoViewController.swift | 26 ++-- .../ObjectObserverDemoViewController.swift | 2 +- .../CustomLoggerViewController.swift | 12 +- .../MigrationsDemoViewController.swift | 147 ++++++++---------- .../TransactionsDemoViewController.swift | 2 +- CoreStoreTests/BaseTests/BaseTestCase.swift | 4 +- CoreStoreTests/QueryTests.swift | 12 +- Sources/CoreStore.swift | 2 +- Sources/Internal/CoreStoreFetchRequest.swift | 15 +- .../Internal/DispatchQueue+CoreStore.swift | 15 +- .../FetchedResultsControllerDelegate.swift | 17 +- .../NSManagedObjectContext+Transaction.swift | 2 +- Sources/Internal/NotificationObserver.swift | 2 +- Sources/Setup/DataStack.swift | 9 +- .../Transactions/BaseDataTransaction.swift | 2 +- .../Transactions/DataStack+Transaction.swift | 5 +- 19 files changed, 150 insertions(+), 158 deletions(-) diff --git a/CoreStoreDemo/CoreStoreDemo/AppDelegate.swift b/CoreStoreDemo/CoreStoreDemo/AppDelegate.swift index 3efdff3..2e0af90 100644 --- a/CoreStoreDemo/CoreStoreDemo/AppDelegate.swift +++ b/CoreStoreDemo/CoreStoreDemo/AppDelegate.swift @@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { application.statusBarStyle = .lightContent diff --git a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift index ee45427..dcb8d45 100644 --- a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift @@ -27,9 +27,9 @@ private struct Static { transaction.deleteAll(From()) - for name in Foundation.TimeZone.knownTimeZoneNames { + for name in NSTimeZone.knownTimeZoneNames { - let rawTimeZone = Foundation.TimeZone(name: name)! + let rawTimeZone = NSTimeZone(name: name)! let cachedTimeZone = transaction.create(Into()) cachedTimeZone.name = rawTimeZone.name @@ -73,13 +73,13 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo self.present(alert, animated: true, completion: nil) } - override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { super.prepare(for: segue, sender: sender) if let indexPath = sender as? IndexPath { - switch segue.destinationViewController { + switch segue.destination { case let controller as FetchingResultsViewController: let item = self.fetchingItems[indexPath.row] @@ -222,7 +222,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo private let queryingItems = [ ( title: "Number of Time Zones", - query: { () -> AnyObject in + query: { () -> Any in return Static.timeZonesStack.queryValue( From(), @@ -232,7 +232,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo ), ( title: "Abbreviation For Tokyo's Time Zone", - query: { () -> AnyObject in + query: { () -> Any in return Static.timeZonesStack.queryValue( From(), @@ -243,7 +243,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo ), ( title: "All Abbreviations", - query: { () -> AnyObject in + query: { () -> Any in return Static.timeZonesStack.queryAttributes( From(), @@ -254,7 +254,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo ), ( title: "Number of Countries per Time Zone", - query: { () -> AnyObject in + query: { () -> Any in return Static.timeZonesStack.queryAttributes( From(), @@ -266,7 +266,7 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo ), ( title: "Number of Countries with Summer Time", - query: { () -> AnyObject in + query: { () -> Any in return Static.timeZonesStack.queryAttributes( From(), diff --git a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift index 45f3e25..2f01c73 100644 --- a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift @@ -12,23 +12,23 @@ class QueryingResultsViewController: UITableViewController { // MARK: Public - func set(value: AnyObject?, title: String) { + func set(value: Any?, title: String) { switch value { - case (let array as [AnyObject])?: - self.values = array.map { (item: AnyObject) -> (title: String, detail: String) in + case (let array as [Any])?: + self.values = array.map { (item: Any) -> (title: String, detail: String) in ( - title: item.description, - detail: String(reflecting: item.dynamicType) + title: String(describing: item), + detail: String(reflecting: type(of: item)) ) } case let item?: self.values = [ ( - title: item.description, - detail: String(reflecting: item.dynamicType) + title: String(describing: item), + detail: String(reflecting: type(of: item)) ) ] diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift index 7b9328a..40925eb 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift @@ -14,17 +14,17 @@ private struct Static { enum Filter: String { - case All = "All Colors" - case Light = "Light Colors" - case Dark = "Dark Colors" + case all = "All Colors" + case light = "Light Colors" + case dark = "Dark Colors" func next() -> Filter { switch self { - case All: return .Light - case Light: return .Dark - case Dark: return .All + case .all: return .light + case .light: return .dark + case .dark: return .all } } @@ -32,14 +32,14 @@ private struct Static { switch self { - case .All: return Where(true) - case .Light: return Where("brightness >= 0.9") - case .Dark: return Where("brightness <= 0.4") + case .all: return Where(true) + case .light: return Where("brightness >= 0.9") + case .dark: return Where("brightness <= 0.4") } } } - static var filter = Filter.All { + static var filter = Filter.all { didSet { @@ -86,7 +86,7 @@ class ListObserverDemoViewController: UITableViewController, ListSectionObserver let navigationItem = self.navigationItem navigationItem.leftBarButtonItems = [ - self.editButtonItem(), + self.editButtonItem, UIBarButtonItem( barButtonSystemItem: .trash, target: self, @@ -115,11 +115,11 @@ class ListObserverDemoViewController: UITableViewController, ListSectionObserver self.setTable(enabled: !Static.palettes.isPendingRefetch) } - override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) { + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { super.prepare(for: segue, sender: sender) - switch (segue.identifier, segue.destinationViewController, sender) { + switch (segue.identifier, segue.destination, sender) { case ("ObjectObserverDemoViewController"?, let destinationViewController as ObjectObserverDemoViewController, let palette as Palette): destinationViewController.palette = palette diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift index 19819af..c37d295 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift @@ -98,7 +98,7 @@ class ObjectObserverDemoViewController: UIViewController, ObjectObserver { self.colorView?.alpha = 0.3 self.hsbLabel?.text = "Deleted" - self.hsbLabel?.textColor = UIColor.red() + self.hsbLabel?.textColor = UIColor.red self.hueSlider?.isEnabled = false self.saturationSlider?.isEnabled = false diff --git a/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift b/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift index 3d2e904..9864f18 100644 --- a/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift @@ -51,7 +51,7 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { func log(level: LogLevel, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { - GCDQueue.main.async { [weak self] in + DispatchQueue.main.async { [weak self] in let levelString: String switch level { @@ -61,15 +61,15 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { case .warning: levelString = "Warning" case .fatal: levelString = "Fatal" } - self?.textView?.insertText("\((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Log:\(levelString)] \(message)\n\n") + self?.textView?.insertText("\((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Log:\(levelString)] \(message)\n\n") } } func log(error: CoreStoreError, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { - GCDQueue.main.async { [weak self] in + DispatchQueue.main.async { [weak self] in - self?.textView?.insertText("\((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Error] \(message): \(error)\n\n") + self?.textView?.insertText("\((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Error] \(message): \(error)\n\n") } } @@ -81,9 +81,9 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { } let messageString = message() - GCDQueue.main.async { [weak self] in + DispatchQueue.main.async { [weak self] in - self?.textView?.insertText("\((String(fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Assert] \(messageString)\n\n") + self?.textView?.insertText("\((String(describing: fileName) as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Assert] \(messageString)\n\n") } } diff --git a/CoreStoreDemo/CoreStoreDemo/MIgrations Demo/MigrationsDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/MIgrations Demo/MigrationsDemoViewController.swift index e2844d0..4880b11 100644 --- a/CoreStoreDemo/CoreStoreDemo/MIgrations Demo/MigrationsDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/MIgrations Demo/MigrationsDemoViewController.swift @@ -12,7 +12,7 @@ import CoreStore // MARK: - MigrationsDemoViewController -class MigrationsDemoViewController: UIViewController { +class MigrationsDemoViewController: UIViewController, ListObserver, UITableViewDataSource, UITableViewDelegate { // MARK: UIViewController @@ -72,6 +72,71 @@ class MigrationsDemoViewController: UIViewController { self.selectModelVersion(modelMetadata) } + // MARK: ListObserver + + func listMonitorWillChange(_ monitor: ListMonitor) { } + + func listMonitorDidChange(_ monitor: ListMonitor) { + + if self.lastSelectedIndexPath == nil, + let numberOfObjectsInSection = self.listMonitor?.numberOfObjectsInSection(0), + numberOfObjectsInSection > 0 { + + self.tableView?.reloadData() + self.setSelectedIndexPath(IndexPath(row: 0, section: 0), scrollToSelection: false) + } + else { + + self.updateDisplay(reloadData: true, scrollToSelection: true, animated: true) + } + } + + // MARK: UITableViewDataSource + + @objc dynamic func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + + return self.listMonitor?.numberOfObjectsInSection(0) ?? 0 + } + + @objc dynamic func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + let cell = tableView.dequeueReusableCell(withIdentifier: "OrganismTableViewCell", for: indexPath) as! OrganismTableViewCell + + let dna = (self.listMonitor?[indexPath] as? OrganismProtocol)?.dna.description ?? "" + cell.dnaLabel?.text = "DNA: \(dna)" + cell.mutateButtonHandler = { [weak self] _ -> Void in + + guard let `self` = self, + let dataStack = self.dataStack, + let organism = self.listMonitor?[indexPath] else { + + return + } + + self.setSelectedIndexPath(indexPath, scrollToSelection: false) + self.setEnabled(false) + dataStack.beginAsynchronous { [weak self] (transaction) -> Void in + + let organism = transaction.edit(organism) as! OrganismProtocol + organism.mutate() + + transaction.commit { _ -> Void in + + self?.setEnabled(true) + } + } + } + return cell + } + + + // MARK: UITableViewDelegate + + @objc dynamic func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + self.setSelectedIndexPath(indexPath, scrollToSelection: false) + } + // MARK: Private @@ -176,8 +241,7 @@ class MigrationsDemoViewController: UIViewController { let count = dataStack.queryValue( From(model.entityType), - Select(.count("dna")) - ) + Select(.count("dna")))! if count > 0 { self.setEnabled(true) @@ -287,7 +351,7 @@ class MigrationsDemoViewController: UIViewController { for property in organism.entity.properties { - let value: AnyObject = organism.value(forKey: property.name) ?? NSNull() + let value = organism.value(forKey: property.name) ?? NSNull() lines.append("\(property.name): \(value)") } organismType = organism.entity.managedObjectClassName @@ -321,78 +385,3 @@ class MigrationsDemoViewController: UIViewController { } } } - - -// MARK: - MigrationsDemoViewController: ListObserver - -extension MigrationsDemoViewController: ListObserver { - - // MARK: ListObserver - - func listMonitorWillChange(_ monitor: ListMonitor) { } - - func listMonitorDidChange(_ monitor: ListMonitor) { - - if self.lastSelectedIndexPath == nil && self.listMonitor?.numberOfObjectsInSection(0) > 0 { - - self.tableView?.reloadData() - self.setSelectedIndexPath(IndexPath(row: 0, section: 0), scrollToSelection: false) - } - else { - - self.updateDisplay(reloadData: true, scrollToSelection: true, animated: true) - } - } -} - - -// MARK: - MigrationsDemoViewController: UITableViewDataSource, UITableViewDelegate - -extension MigrationsDemoViewController: UITableViewDataSource, UITableViewDelegate { - - // MARK: UITableViewDataSource - - @objc dynamic func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - - return self.listMonitor?.numberOfObjectsInSection(0) ?? 0 - } - - @objc dynamic func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - - let cell = tableView.dequeueReusableCell(withIdentifier: "OrganismTableViewCell", for: indexPath) as! OrganismTableViewCell - - let dna = (self.listMonitor?[indexPath] as? OrganismProtocol)?.dna.description ?? "" - cell.dnaLabel?.text = "DNA: \(dna)" - cell.mutateButtonHandler = { [weak self] _ -> Void in - - guard let `self` = self, - let dataStack = self.dataStack, - let organism = self.listMonitor?[indexPath] else { - - return - } - - self.setSelectedIndexPath(indexPath, scrollToSelection: false) - self.setEnabled(false) - dataStack.beginAsynchronous { [weak self] (transaction) -> Void in - - let organism = transaction.edit(organism) as! OrganismProtocol - organism.mutate() - - transaction.commit { _ -> Void in - - self?.setEnabled(true) - } - } - } - return cell - } - - - // MARK: UITableViewDelegate - - @objc dynamic func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - - self.setSelectedIndexPath(indexPath, scrollToSelection: false) - } -} diff --git a/CoreStoreDemo/CoreStoreDemo/Transactions Demo/TransactionsDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/Transactions Demo/TransactionsDemoViewController.swift index 90aed0f..f73dd89 100644 --- a/CoreStoreDemo/CoreStoreDemo/Transactions Demo/TransactionsDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Transactions Demo/TransactionsDemoViewController.swift @@ -135,7 +135,7 @@ class TransactionsDemoViewController: UIViewController, MKMapViewDelegate, Objec if let mapView = self.mapView { - mapView.removeAnnotations(mapView.annotations ?? []) + mapView.removeAnnotations(mapView.annotations) mapView.addAnnotation(object) mapView.setCenter(object.coordinate, animated: true) mapView.selectAnnotation(object, animated: true) diff --git a/CoreStoreTests/BaseTests/BaseTestCase.swift b/CoreStoreTests/BaseTests/BaseTestCase.swift index af776db..4ce253e 100644 --- a/CoreStoreTests/BaseTests/BaseTestCase.swift +++ b/CoreStoreTests/BaseTests/BaseTestCase.swift @@ -97,13 +97,13 @@ class BaseTestCase: XCTestCase { @nonobjc func checkExpectationsImmediately() { - self.waitForExpectations(timeout: 0, handler: nil) + self.waitForExpectations(timeout: 0, handler: { _ in }) } @nonobjc func waitAndCheckExpectations() { - self.waitForExpectations(timeout: 10, handler: nil) + self.waitForExpectations(timeout: 10, handler: {_ in }) } // MARK: XCTestCase diff --git a/CoreStoreTests/QueryTests.swift b/CoreStoreTests/QueryTests.swift index 4beff21..f613bd3 100644 --- a/CoreStoreTests/QueryTests.swift +++ b/CoreStoreTests/QueryTests.swift @@ -1170,7 +1170,7 @@ class QueryTests: BaseTestDataTestCase { ] do { - let values: [NSDictionary]? = stack.queryAttributes( + let values = stack.queryAttributes( from, Select( "testBoolean", @@ -1185,7 +1185,7 @@ class QueryTests: BaseTestDataTestCase { ) XCTAssertNotNil(values) XCTAssertEqual( - values!, + values as Any as! [NSDictionary], [ [ "testBoolean": NSNumber(value: false), @@ -1221,7 +1221,7 @@ class QueryTests: BaseTestDataTestCase { let queryClauses: [QueryClause] = [] do { - let values: [NSDictionary]? = stack.queryAttributes( + let values = stack.queryAttributes( from, Select( .sum("testBoolean"), @@ -1234,7 +1234,7 @@ class QueryTests: BaseTestDataTestCase { ) XCTAssertNotNil(values) XCTAssertEqual( - values!, + values as Any as! [NSDictionary], [ [ "sum(testBoolean)": 3, @@ -1248,7 +1248,7 @@ class QueryTests: BaseTestDataTestCase { } do { - let values: [NSDictionary]? = stack.queryAttributes( + let values = stack.queryAttributes( from, Select( .sum("testBoolean", as: "testSum"), @@ -1261,7 +1261,7 @@ class QueryTests: BaseTestDataTestCase { ) XCTAssertNotNil(values) XCTAssertEqual( - values!, + values as Any as! [NSDictionary], [ [ "testSum": 3, diff --git a/Sources/CoreStore.swift b/Sources/CoreStore.swift index c802015..718231f 100644 --- a/Sources/CoreStore.swift +++ b/Sources/CoreStore.swift @@ -63,7 +63,7 @@ public enum CoreStore { // MARK: Private - private static let defaultStackBarrierQueue = DispatchQueue(concurrentWith: "com.coreStore.defaultStackBarrierQueue") + private static let defaultStackBarrierQueue = DispatchQueue.concurrent("com.coreStore.defaultStackBarrierQueue") private static var defaultStackInstance: DataStack? } diff --git a/Sources/Internal/CoreStoreFetchRequest.swift b/Sources/Internal/CoreStoreFetchRequest.swift index 528120a..5178351 100644 --- a/Sources/Internal/CoreStoreFetchRequest.swift +++ b/Sources/Internal/CoreStoreFetchRequest.swift @@ -45,9 +45,18 @@ internal final class CoreStoreFetchRequest: NSFetchRequ // MARK: NSFetchRequest @objc - override var affectedStores: [NSPersistentStore]? { + dynamic override var affectedStores: [NSPersistentStore]? { - get { return super.affectedStores } - set { super.affectedStores = newValue } + get { + + return super.affectedStores +// let affectedStores: NSArray? = super.affectedStores.flatMap({ NSArray(array: $0) } ) +// return affectedStores as? [NSPersistentStore] + } + set { + + super.affectedStores = newValue +// super.affectedStores = newValue.flatMap(Array.init) + } } } diff --git a/Sources/Internal/DispatchQueue+CoreStore.swift b/Sources/Internal/DispatchQueue+CoreStore.swift index f3a80ea..ac3c654 100644 --- a/Sources/Internal/DispatchQueue+CoreStore.swift +++ b/Sources/Internal/DispatchQueue+CoreStore.swift @@ -30,9 +30,10 @@ import Foundation internal extension DispatchQueue { - internal convenience init(serialWith label: String, qos: DispatchQoS = .default) { + @nonobjc + internal static func serial(_ label: String, qos: DispatchQoS = .default) -> DispatchQueue { - self.init( + return DispatchQueue( label: label, qos: qos, attributes: [], @@ -41,9 +42,10 @@ internal extension DispatchQueue { ) } - internal convenience init(concurrentWith label: String, qos: DispatchQoS = .default) { + @nonobjc + internal static func concurrent(_ label: String, qos: DispatchQoS = .default) -> DispatchQueue { - self.init( + return DispatchQueue( label: label, qos: qos, attributes: .concurrent, @@ -52,6 +54,7 @@ internal extension DispatchQueue { ) } + @nonobjc internal func cs_isCurrentExecutionContext() -> Bool { let specific = ObjectIdentifier(self) @@ -60,21 +63,25 @@ internal extension DispatchQueue { return DispatchQueue.getSpecific(key: Static.specificKey) == specific } + @nonobjc internal func cs_sync(_ closure: () throws -> T) rethrows -> T { return try self.sync { try autoreleasepool(invoking: closure) } } + @nonobjc internal func cs_async(_ closure: @escaping () -> Void) { self.async { autoreleasepool(invoking: closure) } } + @nonobjc internal func cs_barrierSync(_ closure: () throws -> T) rethrows -> T { return try self.sync(flags: .barrier) { try autoreleasepool(invoking: closure) } } + @nonobjc internal func cs_barrierAsync(_ closure: @escaping () -> Void) { self.async(flags: .barrier) { autoreleasepool(invoking: closure) } diff --git a/Sources/Internal/FetchedResultsControllerDelegate.swift b/Sources/Internal/FetchedResultsControllerDelegate.swift index 2f09811..453c908 100644 --- a/Sources/Internal/FetchedResultsControllerDelegate.swift +++ b/Sources/Internal/FetchedResultsControllerDelegate.swift @@ -108,7 +108,7 @@ internal final class FetchedResultsControllerDelegate Void) = { _ in }) { + internal func saveAsynchronouslyWithCompletion(_ completion: @escaping ((_ result: SaveResult) -> Void) = { _ in }) { self.perform { diff --git a/Sources/Internal/NotificationObserver.swift b/Sources/Internal/NotificationObserver.swift index 50c650f..38f362e 100644 --- a/Sources/Internal/NotificationObserver.swift +++ b/Sources/Internal/NotificationObserver.swift @@ -34,7 +34,7 @@ internal final class NotificationObserver { let observer: NSObjectProtocol - init(notificationName: Notification.Name, object: AnyObject?, queue: OperationQueue? = nil, closure: @escaping (_ note: Notification) -> Void) { + init(notificationName: Notification.Name, object: Any?, queue: OperationQueue? = nil, closure: @escaping (_ note: Notification) -> Void) { self.observer = NotificationCenter.default.addObserver( forName: notificationName, diff --git a/Sources/Setup/DataStack.swift b/Sources/Setup/DataStack.swift index 09077fb..d0cf4f0 100644 --- a/Sources/Setup/DataStack.swift +++ b/Sources/Setup/DataStack.swift @@ -385,18 +385,15 @@ public final class DataStack { internal let mainContext: NSManagedObjectContext internal let model: NSManagedObjectModel internal let migrationChain: MigrationChain - internal let childTransactionQueue = DispatchQueue(serialWith: "com.coreStore.dataStack.childTransactionQueue") - internal let storeMetadataUpdateQueue = DispatchQueue(concurrentWith: "com.coreStore.persistentStoreBarrierQueue") + internal let childTransactionQueue = DispatchQueue.serial("com.coreStore.dataStack.childTransactionQueue") + internal let storeMetadataUpdateQueue = DispatchQueue.concurrent("com.coreStore.persistentStoreBarrierQueue") internal let migrationQueue: OperationQueue = { let migrationQueue = OperationQueue() migrationQueue.maxConcurrentOperationCount = 1 migrationQueue.name = "com.coreStore.migrationOperationQueue" migrationQueue.qualityOfService = .utility - migrationQueue.underlyingQueue = DispatchQueue( - serialWith: "com.coreStore.migrationQueue", - qos: .userInitiated - ) + migrationQueue.underlyingQueue = DispatchQueue.serial("com.coreStore.migrationQueue", qos: .userInitiated) return migrationQueue }() diff --git a/Sources/Transactions/BaseDataTransaction.swift b/Sources/Transactions/BaseDataTransaction.swift index a6abad6..a61ab56 100644 --- a/Sources/Transactions/BaseDataTransaction.swift +++ b/Sources/Transactions/BaseDataTransaction.swift @@ -451,7 +451,7 @@ public /*abstract*/ class BaseDataTransaction { internal let context: NSManagedObjectContext internal let transactionQueue: DispatchQueue - internal let childTransactionQueue = DispatchQueue(serialWith: "com.corestore.datastack.childtransactionqueue") + internal let childTransactionQueue = DispatchQueue.serial("com.corestore.datastack.childtransactionqueue") internal let supportsUndo: Bool internal let bypassesQueueing: Bool diff --git a/Sources/Transactions/DataStack+Transaction.swift b/Sources/Transactions/DataStack+Transaction.swift index 0775534..310a34b 100644 --- a/Sources/Transactions/DataStack+Transaction.swift +++ b/Sources/Transactions/DataStack+Transaction.swift @@ -69,10 +69,7 @@ public extension DataStack { return UnsafeDataTransaction( mainContext: self.rootSavingContext, - queue: DispatchQueue( - serialWith: "com.coreStore.dataStack.unsafeTransactionQueue", - qos: .userInitiated - ), + queue: DispatchQueue.serial("com.coreStore.dataStack.unsafeTransactionQueue", qos: .userInitiated), supportsUndo: supportsUndo ) }