BaseCoreData.swift 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. //
  2. // BaseCoreData.swift
  3. // CommonUtil
  4. //
  5. // Created by lijunjie on 15/12/7.
  6. // Copyright © 2015年 lijunjie. All rights reserved.
  7. //
  8. import Foundation
  9. import CoreData
  10. public class BaseCoreData {
  11. private var PSC: NSPersistentStoreCoordinator?
  12. private var persistentStoreCoordinator: NSPersistentStoreCoordinator? {
  13. get {
  14. if managedObjectModel == nil {
  15. return nil
  16. }
  17. if PSC != nil {
  18. return PSC
  19. }
  20. let databasePath = self.getPath()
  21. let storeURL = NSURL.fileURL(withPath: databasePath)
  22. PSC = NSPersistentStoreCoordinator.init(managedObjectModel:managedObjectModel!)
  23. do {
  24. try persistentStore = PSC?.addPersistentStore(ofType: storeType, configurationName: nil, at: storeURL, options: nil)
  25. } catch {
  26. print("Unresolved error")
  27. abort()
  28. }
  29. if persistentStore == nil {
  30. print("Unresolved error")
  31. abort()
  32. }
  33. return PSC
  34. }
  35. set {
  36. self.persistentStoreCoordinator = newValue
  37. }
  38. }
  39. private var MOM: NSManagedObjectModel?
  40. private var managedObjectModel: NSManagedObjectModel? {
  41. get {
  42. if modelFileName.isEmpty {
  43. return nil
  44. }
  45. if MOM != nil {
  46. return MOM
  47. }
  48. let rag = modelFileName.range(of:".momd")
  49. var copymodFileName = modelFileName
  50. if let r = rag {
  51. copymodFileName = modelFileName.substring(to:r.upperBound)
  52. }
  53. let modelURL = Bundle.main.url(forResource: copymodFileName, withExtension: "momd")
  54. MOM = NSManagedObjectModel(contentsOf: modelURL!)
  55. return MOM
  56. }
  57. set {
  58. MOM = newValue
  59. }
  60. }
  61. public var managedObjectContext: NSManagedObjectContext?
  62. private var persistentStore: NSPersistentStore?
  63. private var modelFileName: String = ""
  64. private var savePath: String = ""
  65. private var saveName: String = ""
  66. private var storeType: String = ""
  67. public init(modelFileName: String, savePath: String, saveName: String, storeType: String) {
  68. self.modelFileName = modelFileName
  69. self.saveName = saveName
  70. self.savePath = savePath
  71. self.storeType = storeType
  72. self.initManagedObjectContext()
  73. }
  74. public func cleanUp() {
  75. persistentStoreCoordinator = nil
  76. managedObjectModel = nil
  77. managedObjectContext = nil
  78. persistentStore = nil
  79. }
  80. public func initManagedObjectContext() {
  81. if managedObjectModel == nil {
  82. return
  83. }
  84. if persistentStoreCoordinator == nil {
  85. return
  86. }
  87. if managedObjectContext == nil {
  88. managedObjectContext = NSManagedObjectContext.init(concurrencyType: .privateQueueConcurrencyType)
  89. managedObjectContext?.persistentStoreCoordinator = persistentStoreCoordinator
  90. managedObjectContext?.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
  91. }
  92. }
  93. private func getPath() -> String {
  94. let fileMgr: FileManager = FileManager.default
  95. if !fileMgr.fileExists(atPath: savePath) {
  96. do {
  97. try fileMgr.createDirectory(atPath: savePath, withIntermediateDirectories: true, attributes: nil)
  98. } catch {
  99. print("创建文件失败!")
  100. }
  101. }
  102. return (savePath as NSString).appendingPathComponent(saveName)
  103. }
  104. public func performBlock(block: @escaping () -> Void) {
  105. let moc = managedObjectContext
  106. moc?.perform(block)
  107. }
  108. public func performBlock(block: @escaping (_ moc: NSManagedObjectContext) -> Void, complete: @escaping () -> Void) {
  109. let moc = managedObjectContext
  110. moc?.perform({ () -> Void in
  111. block(moc!)
  112. DispatchQueue.main.async(execute: complete)
  113. })
  114. }
  115. public func safelySaveContextMOC() {
  116. self.managedObjectContext?.performAndWait({ () -> Void in
  117. self.saveContextMOC()
  118. })
  119. }
  120. public func unsafelySaveContextMOC() {
  121. self.managedObjectContext?.perform({ () -> Void in
  122. self.saveContextMOC()
  123. })
  124. }
  125. private func saveContextMOC() {
  126. self.saveContext(savedMoc: self.managedObjectContext!)
  127. }
  128. private func saveContext(savedMoc:NSManagedObjectContext) -> Bool {
  129. var contextToSave:NSManagedObjectContext? = savedMoc
  130. while (contextToSave != nil) {
  131. var success = false
  132. do {
  133. let s: NSSet = (contextToSave?.insertedObjects)! as NSSet
  134. try contextToSave?.obtainPermanentIDs(for: s.allObjects as! [NSManagedObject])
  135. } catch {
  136. print("保存失败!!!")
  137. return false
  138. }
  139. if contextToSave?.hasChanges == true {
  140. do {
  141. try contextToSave?.save()
  142. success = true
  143. } catch {
  144. print("Saving of managed object context failed")
  145. success = false
  146. }
  147. } else {
  148. success = true
  149. }
  150. if success == false {
  151. return false
  152. }
  153. if contextToSave!.parent == nil && contextToSave!.persistentStoreCoordinator == nil {
  154. print("Reached the end of the chain of nested managed object contexts without encountering a persistent store coordinator. Objects are not fully persisted.")
  155. return false
  156. }
  157. contextToSave = contextToSave?.parent
  158. }
  159. return true
  160. }
  161. }