diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 5536c4b..c7e0cbe 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -85,10 +85,6 @@ B519E45A1C4CD2DA00E7B469 /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B519E4571C4CD2CA00E7B469 /* GCDKit.framework */; }; B519E45B1C4CD2ED00E7B469 /* GCDKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B519E4571C4CD2CA00E7B469 /* GCDKit.framework */; }; B51BE06A1B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51BE0691B47FC4B0069F532 /* NSManagedObjectModel+Setup.swift */; }; - B51F259A1C5747DD0083A5DD /* DataStack+iCloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51F25991C5747DD0083A5DD /* DataStack+iCloud.swift */; }; - B51F259B1C57875E0083A5DD /* DataStack+iCloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51F25991C5747DD0083A5DD /* DataStack+iCloud.swift */; }; - B51F259C1C57875F0083A5DD /* DataStack+iCloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51F25991C5747DD0083A5DD /* DataStack+iCloud.swift */; }; - B51F259D1C5787600083A5DD /* DataStack+iCloud.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51F25991C5747DD0083A5DD /* DataStack+iCloud.swift */; }; B5202CFA1C04688100DED140 /* NSFetchedResultsController+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5202CF91C04688100DED140 /* NSFetchedResultsController+Convenience.swift */; }; B5202CFD1C046E8400DED140 /* NSFetchedResultsController+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5202CF91C04688100DED140 /* NSFetchedResultsController+Convenience.swift */; }; B52DD17E1BE1F8CD00949AFE /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B52DD1741BE1F8CC00949AFE /* CoreStore.framework */; }; diff --git a/CoreStore/NSError+CoreStore.swift b/CoreStore/NSError+CoreStore.swift index f5168d8..d32a995 100644 --- a/CoreStore/NSError+CoreStore.swift +++ b/CoreStore/NSError+CoreStore.swift @@ -58,11 +58,6 @@ public enum CoreStoreErrorCode: Int { An `NSMappingModel` could not be found for a specific source and destination model versions. */ case MappingModelNotFound - - /** - The container could not be located or if iCloud storage is unavailable for the current user or device. - */ - case ICloudContainerNotFound } diff --git a/CoreStore/iCloud/DataStack+iCloud.swift b/CoreStore/iCloud/DataStack+iCloud.swift deleted file mode 100644 index fad2ebc..0000000 --- a/CoreStore/iCloud/DataStack+iCloud.swift +++ /dev/null @@ -1,169 +0,0 @@ -// -// DataStack+iCloud.swift -// CoreStore -// -// Copyright © 2016 John Rommel Estropia -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import Foundation -import CoreData -#if USE_FRAMEWORKS - import GCDKit -#endif - -public extension DataStack { - - public func addICloudStore(ubiquitousContentName: String, ubiquitousContentURLRelativePath: String? = nil, ubiquitousContainerID: String? = nil, ubiquitousPeerToken: String? = nil, configuration: String? = nil, mappingModelBundles: [NSBundle]? = NSBundle.allBundles(), automigrating: Bool, resetStoreOnModelMismatch: Bool = false, completion: (PersistentStoreResult) -> Void) throws -> NSProgress? { - - CoreStore.assert( - !ubiquitousContentName.isEmpty, - "The ubiquitousContentName cannot be empty." - ) - CoreStore.assert( - !ubiquitousContentName.containsString("."), - "The ubiquitousContentName cannot contain periods." - ) - CoreStore.assert( - ubiquitousContentURLRelativePath?.isEmpty != true, - "The ubiquitousContentURLRelativePath should not be empty if provided." - ) - CoreStore.assert( - ubiquitousPeerToken?.isEmpty != true, - "The ubiquitousPeerToken should not be empty if provided." - ) - - let fileManager = NSFileManager.defaultManager() - guard let fileURL = fileManager.URLForUbiquityContainerIdentifier(ubiquitousContainerID) else { - - throw NSError(coreStoreErrorCode: .ICloudContainerNotFound) - } - - let coordinator = self.coordinator; - if let store = coordinator.persistentStoreForURL(fileURL) { - - guard store.type == NSSQLiteStoreType - && store.configurationName == (configuration ?? Into.defaultConfigurationName) else { - - let error = NSError(coreStoreErrorCode: .DifferentPersistentStoreExistsAtURL) - CoreStore.handleError( - error, - "Failed to add SQLite \(typeName(NSPersistentStore)) at \"\(fileURL)\" because a different \(typeName(NSPersistentStore)) at that URL already exists." - ) - throw error - } - - GCDQueue.Main.async { - - completion(PersistentStoreResult(store)) - } - return nil - } - - _ = try? fileManager.createDirectoryAtURL( - fileURL.URLByDeletingLastPathComponent!, - withIntermediateDirectories: true, - attributes: nil - ) - - var options = self.optionsForSQLiteStore() - options[NSPersistentStoreUbiquitousContentNameKey] = ubiquitousContentName - options[NSMigratePersistentStoresAutomaticallyOption] = automigrating - options[NSInferMappingModelAutomaticallyOption] = automigrating - - if let ubiquitousContentURLRelativePath = ubiquitousContentURLRelativePath { - - options[NSPersistentStoreUbiquitousContentURLKey] = ubiquitousContentURLRelativePath - } - if let ubiquitousContainerID = ubiquitousContainerID { - - options[NSPersistentStoreUbiquitousContainerIdentifierKey] = ubiquitousContainerID - } - if let ubiquitousPeerToken = ubiquitousPeerToken { - - options[NSPersistentStoreUbiquitousPeerTokenOption] = ubiquitousPeerToken - } - - var store: NSPersistentStore? - var storeError: NSError? - coordinator.performBlockAndWait { - - do { - - store = try coordinator.addPersistentStoreWithType( - NSSQLiteStoreType, - configuration: configuration, - URL: fileURL, - options: options - ) - } - catch { - - storeError = error as NSError - } - } - - if let store = store { - - self.updateMetadataForPersistentStore(store) - return store - } - - if let error = storeError - where (resetStoreOnModelMismatch && error.isCoreDataMigrationError) { - - fileManager.removeSQLiteStoreAtURL(fileURL) - - var store: NSPersistentStore? - coordinator.performBlockAndWait { - - do { - - store = try coordinator.addPersistentStoreWithType( - NSSQLiteStoreType, - configuration: configuration, - URL: fileURL, - options: options - ) - } - catch { - - storeError = error as NSError - } - } - - if let store = store { - - self.updateMetadataForPersistentStore(store) - return store - } - } - - let error = storeError ?? NSError(coreStoreErrorCode: .UnknownError) - CoreStore.handleError( - error, - "Failed to add SQLite \(typeName(NSPersistentStore)) at \"\(fileURL)\"." - ) - throw error - - - - } -}