| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- //
- // BaseCoreData.swift
- // CommonUtil
- //
- // Created by lijunjie on 15/12/7.
- // Copyright © 2015年 lijunjie. All rights reserved.
- //
- import Foundation
- import CoreData
- public class BaseCoreData {
-
- private var PSC: NSPersistentStoreCoordinator?
- private var persistentStoreCoordinator: NSPersistentStoreCoordinator? {
- get {
- if managedObjectModel == nil {
- return nil
- }
-
- if PSC != nil {
- return PSC
- }
-
- let databasePath = self.getPath()
- let storeURL = NSURL.fileURL(withPath: databasePath)
-
- PSC = NSPersistentStoreCoordinator.init(managedObjectModel:managedObjectModel!)
-
- do {
- try persistentStore = PSC?.addPersistentStore(ofType: storeType, configurationName: nil, at: storeURL, options: nil)
- } catch {
- print("Unresolved error")
- abort()
- }
-
- if persistentStore == nil {
- print("Unresolved error")
- abort()
- }
-
- return PSC
- }
- set {
- self.persistentStoreCoordinator = newValue
- }
- }
-
- private var MOM: NSManagedObjectModel?
- private var managedObjectModel: NSManagedObjectModel? {
- get {
- if modelFileName.isEmpty {
- return nil
- }
-
- if MOM != nil {
- return MOM
- }
-
- let rag = modelFileName.range(of:".momd")
- var copymodFileName = modelFileName
-
- if let r = rag {
- copymodFileName = modelFileName.substring(to:r.upperBound)
- }
- let modelURL = Bundle.main.url(forResource: copymodFileName, withExtension: "momd")
- MOM = NSManagedObjectModel(contentsOf: modelURL!)
- return MOM
- }
- set {
- MOM = newValue
- }
- }
- public var managedObjectContext: NSManagedObjectContext?
- private var persistentStore: NSPersistentStore?
- private var modelFileName: String = ""
- private var savePath: String = ""
- private var saveName: String = ""
- private var storeType: String = ""
-
- public init(modelFileName: String, savePath: String, saveName: String, storeType: String) {
- self.modelFileName = modelFileName
- self.saveName = saveName
- self.savePath = savePath
- self.storeType = storeType
- self.initManagedObjectContext()
- }
-
- public func cleanUp() {
- persistentStoreCoordinator = nil
- managedObjectModel = nil
- managedObjectContext = nil
- persistentStore = nil
- }
-
- public func initManagedObjectContext() {
- if managedObjectModel == nil {
- return
- }
-
- if persistentStoreCoordinator == nil {
- return
- }
-
- if managedObjectContext == nil {
- managedObjectContext = NSManagedObjectContext.init(concurrencyType: .privateQueueConcurrencyType)
- managedObjectContext?.persistentStoreCoordinator = persistentStoreCoordinator
- managedObjectContext?.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
- }
- }
-
- private func getPath() -> String {
- let fileMgr: FileManager = FileManager.default
-
- if !fileMgr.fileExists(atPath: savePath) {
- do {
- try fileMgr.createDirectory(atPath: savePath, withIntermediateDirectories: true, attributes: nil)
- } catch {
- print("创建文件失败!")
- }
- }
- return (savePath as NSString).appendingPathComponent(saveName)
- }
-
- public func performBlock(block: @escaping () -> Void) {
- let moc = managedObjectContext
- moc?.perform(block)
- }
-
- public func performBlock(block: @escaping (_ moc: NSManagedObjectContext) -> Void, complete: @escaping () -> Void) {
- let moc = managedObjectContext
- moc?.perform({ () -> Void in
- block(moc!)
- DispatchQueue.main.async(execute: complete)
- })
- }
-
- public func safelySaveContextMOC() {
- self.managedObjectContext?.performAndWait({ () -> Void in
- self.saveContextMOC()
- })
- }
-
- public func unsafelySaveContextMOC() {
- self.managedObjectContext?.perform({ () -> Void in
- self.saveContextMOC()
- })
- }
-
- private func saveContextMOC() {
- self.saveContext(savedMoc: self.managedObjectContext!)
- }
-
- private func saveContext(savedMoc:NSManagedObjectContext) -> Bool {
- var contextToSave:NSManagedObjectContext? = savedMoc
- while (contextToSave != nil) {
- var success = false
- do {
- let s: NSSet = (contextToSave?.insertedObjects)! as NSSet
- try contextToSave?.obtainPermanentIDs(for: s.allObjects as! [NSManagedObject])
- } catch {
- print("保存失败!!!")
- return false
- }
- if contextToSave?.hasChanges == true {
- do {
- try contextToSave?.save()
- success = true
- } catch {
- print("Saving of managed object context failed")
- success = false
- }
- } else {
- success = true
- }
- if success == false {
- return false
- }
- if contextToSave!.parent == nil && contextToSave!.persistentStoreCoordinator == nil {
- print("Reached the end of the chain of nested managed object contexts without encountering a persistent store coordinator. Objects are not fully persisted.")
- return false
- }
- contextToSave = contextToSave?.parent
- }
- return true
- }
- }
|