WIP: StorageInterface

This commit is contained in:
John Rommel Estropia
2016-03-08 07:55:15 +09:00
parent 34495d7163
commit 2f8c100cb6
6 changed files with 21 additions and 22 deletions

View File

@@ -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?

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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,

View File

@@ -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
} }

View File

@@ -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)