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
internal func performBlockAndWait<T>(block: () throws -> T) throws -> T {
@nonobjc internal func performBlockAndWait<T>(block: () throws -> T) throws -> T {
var result: T?
var closureError: ErrorType?
@@ -58,7 +58,7 @@ internal extension NSPersistentStoreCoordinator {
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 storeError: NSError?

View File

@@ -73,8 +73,7 @@ public extension DataStack {
URL: nil,
options: storage.storeOptions
)
self.updateMetadataForPersistentStore(persistentStore)
storage.internalStore = persistentStore
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
GCDQueue.Main.async {
@@ -147,7 +146,8 @@ public extension DataStack {
let fileManager = NSFileManager.defaultManager()
do {
_ = try? fileManager.createDirectoryAtURL(
try fileManager.createDirectoryAtURL(
fileURL.URLByDeletingLastPathComponent!,
withIntermediateDirectories: true,
attributes: nil
@@ -168,9 +168,9 @@ public extension DataStack {
if storage.resetStoreOnModelMismatch && error.isCoreDataMigrationError {
fileManager.removeSQLiteStoreAtURL(fileURL)
do {
try _ = self.model[metadata].flatMap(storage.eraseStorageAndWait)
try self.addStorageAndWait(storage)
GCDQueue.Main.async {
@@ -282,10 +282,6 @@ public extension DataStack {
options: storage.storeOptions
)
}
catch let error as NSError where error.code == NSFileReadNoSuchFileError && error.domain == NSCocoaErrorDomain {
return []
}
catch {
CoreStore.handleError(
@@ -508,8 +504,6 @@ public extension DataStack {
isDirectory: false
)
try storage.eraseStorageAndWait()
let migrationManager = MigrationManager(
sourceModel: sourceModel,
destinationModel: destinationModel,

View File

@@ -154,8 +154,7 @@ public final class DataStack {
URL: nil,
options: storage.storeOptions
)
self.updateMetadataForPersistentStore(persistentStore)
storage.internalStore = persistentStore
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
return storage
}
catch {
@@ -237,7 +236,12 @@ public final class DataStack {
}
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(
storage.dynamicType.storeType,
@@ -247,8 +251,7 @@ public final class DataStack {
)
}
}
self.updateMetadataForPersistentStore(persistentStore)
storage.internalStore = persistentStore
self.updateMetadataForStorage(storage, persistentStore: persistentStore)
return storage
}
catch {
@@ -335,7 +338,9 @@ public final class DataStack {
return returnValue
}
internal func updateMetadataForPersistentStore(persistentStore: NSPersistentStore) {
internal func updateMetadataForStorage(storage: StorageInterface, persistentStore: NSPersistentStore) {
storage.internalStore = persistentStore
self.storeMetadataUpdateQueue.barrierAsync {

View File

@@ -95,14 +95,14 @@ public class SQLiteStore: LocalStorage, DefaultInitializableStore {
public var internalStore: NSPersistentStore?
public func eraseStorageAndWait() throws {
public func eraseStorageAndWait(soureModel soureModel: NSManagedObjectModel) throws {
// TODO: check if attached to persistent store
let fileURL = self.fileURL
try autoreleasepool {
let journalUpdatingCoordinator = NSPersistentStoreCoordinator()
let journalUpdatingCoordinator = NSPersistentStoreCoordinator(managedObjectModel: soureModel)
let store = try journalUpdatingCoordinator.addPersistentStoreWithType(
self.dynamicType.storeType,
configuration: self.configuration,

View File

@@ -55,5 +55,5 @@ public protocol LocalStorage: StorageInterface {
var mappingModelBundles: [NSBundle] { get }
var resetStoreOnModelMismatch: Bool { get }
func eraseStorageAndWait() throws
func eraseStorageAndWait(soureModel soureModel: NSManagedObjectModel) throws
}

View File

@@ -256,8 +256,8 @@ class MigrationsDemoViewController: UIViewController {
else {
self.segmentedControl?.selectedSegmentIndex = UISegmentedControlNoSegment
self._dataStack = nil
self._listMonitor = nil
self._dataStack = nil
}
self.updateDisplay(reloadData: true, scrollToSelection: scrollToSelection, animated: false)