mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-04-18 06:59:42 +02:00
WIP: StorageInterface
This commit is contained in:
@@ -33,7 +33,7 @@ internal extension NSPersistentStoreCoordinator {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
internal func performBlockAndWait<T>(block: () throws -> T) throws -> T {
|
@nonobjc internal func performBlockAndWait<T>(block: () throws -> T) throws -> T {
|
||||||
|
|
||||||
var result: T?
|
var result: T?
|
||||||
var closureError: ErrorType?
|
var closureError: ErrorType?
|
||||||
@@ -58,7 +58,7 @@ internal extension NSPersistentStoreCoordinator {
|
|||||||
throw closureError!
|
throw closureError!
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func addPersistentStoreSynchronously(storeType: String, configuration: String?, URL storeURL: NSURL?, options: [NSObject : AnyObject]?) throws -> NSPersistentStore {
|
@nonobjc internal func addPersistentStoreSynchronously(storeType: String, configuration: String?, URL storeURL: NSURL?, options: [NSObject : AnyObject]?) throws -> NSPersistentStore {
|
||||||
|
|
||||||
var store: NSPersistentStore?
|
var store: NSPersistentStore?
|
||||||
var storeError: NSError?
|
var storeError: NSError?
|
||||||
|
|||||||
@@ -73,8 +73,7 @@ public extension DataStack {
|
|||||||
URL: nil,
|
URL: nil,
|
||||||
options: storage.storeOptions
|
options: storage.storeOptions
|
||||||
)
|
)
|
||||||
self.updateMetadataForPersistentStore(persistentStore)
|
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
|
||||||
storage.internalStore = persistentStore
|
|
||||||
|
|
||||||
GCDQueue.Main.async {
|
GCDQueue.Main.async {
|
||||||
|
|
||||||
@@ -147,7 +146,8 @@ public extension DataStack {
|
|||||||
let fileManager = NSFileManager.defaultManager()
|
let fileManager = NSFileManager.defaultManager()
|
||||||
|
|
||||||
do {
|
do {
|
||||||
_ = try? fileManager.createDirectoryAtURL(
|
|
||||||
|
try fileManager.createDirectoryAtURL(
|
||||||
fileURL.URLByDeletingLastPathComponent!,
|
fileURL.URLByDeletingLastPathComponent!,
|
||||||
withIntermediateDirectories: true,
|
withIntermediateDirectories: true,
|
||||||
attributes: nil
|
attributes: nil
|
||||||
@@ -168,9 +168,9 @@ public extension DataStack {
|
|||||||
|
|
||||||
if storage.resetStoreOnModelMismatch && error.isCoreDataMigrationError {
|
if storage.resetStoreOnModelMismatch && error.isCoreDataMigrationError {
|
||||||
|
|
||||||
fileManager.removeSQLiteStoreAtURL(fileURL)
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
|
try _ = self.model[metadata].flatMap(storage.eraseStorageAndWait)
|
||||||
try self.addStorageAndWait(storage)
|
try self.addStorageAndWait(storage)
|
||||||
|
|
||||||
GCDQueue.Main.async {
|
GCDQueue.Main.async {
|
||||||
@@ -282,10 +282,6 @@ public extension DataStack {
|
|||||||
options: storage.storeOptions
|
options: storage.storeOptions
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
catch let error as NSError where error.code == NSFileReadNoSuchFileError && error.domain == NSCocoaErrorDomain {
|
|
||||||
|
|
||||||
return []
|
|
||||||
}
|
|
||||||
catch {
|
catch {
|
||||||
|
|
||||||
CoreStore.handleError(
|
CoreStore.handleError(
|
||||||
@@ -508,8 +504,6 @@ public extension DataStack {
|
|||||||
isDirectory: false
|
isDirectory: false
|
||||||
)
|
)
|
||||||
|
|
||||||
try storage.eraseStorageAndWait()
|
|
||||||
|
|
||||||
let migrationManager = MigrationManager(
|
let migrationManager = MigrationManager(
|
||||||
sourceModel: sourceModel,
|
sourceModel: sourceModel,
|
||||||
destinationModel: destinationModel,
|
destinationModel: destinationModel,
|
||||||
|
|||||||
@@ -154,8 +154,7 @@ public final class DataStack {
|
|||||||
URL: nil,
|
URL: nil,
|
||||||
options: storage.storeOptions
|
options: storage.storeOptions
|
||||||
)
|
)
|
||||||
self.updateMetadataForPersistentStore(persistentStore)
|
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
|
||||||
storage.internalStore = persistentStore
|
|
||||||
return storage
|
return storage
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
@@ -237,7 +236,12 @@ public final class DataStack {
|
|||||||
}
|
}
|
||||||
catch let error as NSError where storage.resetStoreOnModelMismatch && error.isCoreDataMigrationError {
|
catch let error as NSError where storage.resetStoreOnModelMismatch && error.isCoreDataMigrationError {
|
||||||
|
|
||||||
try storage.eraseStorageAndWait()
|
let metadata = try NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(
|
||||||
|
storage.dynamicType.storeType,
|
||||||
|
URL: fileURL,
|
||||||
|
options: storage.storeOptions
|
||||||
|
)
|
||||||
|
try _ = self.model[metadata].flatMap(storage.eraseStorageAndWait)
|
||||||
|
|
||||||
return try coordinator.addPersistentStoreWithType(
|
return try coordinator.addPersistentStoreWithType(
|
||||||
storage.dynamicType.storeType,
|
storage.dynamicType.storeType,
|
||||||
@@ -247,8 +251,7 @@ public final class DataStack {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.updateMetadataForPersistentStore(persistentStore)
|
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
|
||||||
storage.internalStore = persistentStore
|
|
||||||
return storage
|
return storage
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
@@ -335,7 +338,9 @@ public final class DataStack {
|
|||||||
return returnValue
|
return returnValue
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func updateMetadataForPersistentStore(persistentStore: NSPersistentStore) {
|
internal func updateMetadataForStorage(storage: StorageInterface, persistentStore: NSPersistentStore) {
|
||||||
|
|
||||||
|
storage.internalStore = persistentStore
|
||||||
|
|
||||||
self.storeMetadataUpdateQueue.barrierAsync {
|
self.storeMetadataUpdateQueue.barrierAsync {
|
||||||
|
|
||||||
|
|||||||
@@ -95,14 +95,14 @@ public class SQLiteStore: LocalStorage, DefaultInitializableStore {
|
|||||||
|
|
||||||
public var internalStore: NSPersistentStore?
|
public var internalStore: NSPersistentStore?
|
||||||
|
|
||||||
public func eraseStorageAndWait() throws {
|
public func eraseStorageAndWait(soureModel soureModel: NSManagedObjectModel) throws {
|
||||||
|
|
||||||
// TODO: check if attached to persistent store
|
// TODO: check if attached to persistent store
|
||||||
|
|
||||||
let fileURL = self.fileURL
|
let fileURL = self.fileURL
|
||||||
try autoreleasepool {
|
try autoreleasepool {
|
||||||
|
|
||||||
let journalUpdatingCoordinator = NSPersistentStoreCoordinator()
|
let journalUpdatingCoordinator = NSPersistentStoreCoordinator(managedObjectModel: soureModel)
|
||||||
let store = try journalUpdatingCoordinator.addPersistentStoreWithType(
|
let store = try journalUpdatingCoordinator.addPersistentStoreWithType(
|
||||||
self.dynamicType.storeType,
|
self.dynamicType.storeType,
|
||||||
configuration: self.configuration,
|
configuration: self.configuration,
|
||||||
|
|||||||
@@ -55,5 +55,5 @@ public protocol LocalStorage: StorageInterface {
|
|||||||
var mappingModelBundles: [NSBundle] { get }
|
var mappingModelBundles: [NSBundle] { get }
|
||||||
var resetStoreOnModelMismatch: Bool { get }
|
var resetStoreOnModelMismatch: Bool { get }
|
||||||
|
|
||||||
func eraseStorageAndWait() throws
|
func eraseStorageAndWait(soureModel soureModel: NSManagedObjectModel) throws
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,8 +256,8 @@ class MigrationsDemoViewController: UIViewController {
|
|||||||
else {
|
else {
|
||||||
|
|
||||||
self.segmentedControl?.selectedSegmentIndex = UISegmentedControlNoSegment
|
self.segmentedControl?.selectedSegmentIndex = UISegmentedControlNoSegment
|
||||||
self._dataStack = nil
|
|
||||||
self._listMonitor = nil
|
self._listMonitor = nil
|
||||||
|
self._dataStack = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
self.updateDisplay(reloadData: true, scrollToSelection: scrollToSelection, animated: false)
|
self.updateDisplay(reloadData: true, scrollToSelection: scrollToSelection, animated: false)
|
||||||
|
|||||||
Reference in New Issue
Block a user