@@ -23,17 +23,27 @@ enum PersistenceConst {
23
23
24
24
@available ( iOS 10 . 0 , * )
25
25
class PersistentContainer : NSPersistentContainer {
26
- static let shared : PersistentContainer ? = {
27
- guard let url = ResourceHelper . url ( forResource: PersistenceConst . dataModelFileName, withExtension: PersistenceConst . dataModelExtension, fromBundle: Bundle ( for: PersistentContainer . self) ) else {
28
- ITBError ( " Could not find \( PersistenceConst . dataModelFileName) in bundle " )
29
- return nil
26
+ static var shared : PersistentContainer ?
27
+
28
+ static func initialize( fromBundle bundle: Bundle ) -> PersistentContainer ? {
29
+ if shared == nil {
30
+ shared = create ( fromBundle: bundle)
30
31
}
31
- ITBInfo ( " DB Bundle url: \( url) " )
32
- guard let managedObjectModel = NSManagedObjectModel ( contentsOf: url) else {
32
+ return shared
33
+ }
34
+
35
+ override func newBackgroundContext( ) -> NSManagedObjectContext {
36
+ let backgroundContext = super. newBackgroundContext ( )
37
+ backgroundContext. automaticallyMergesChangesFromParent = true
38
+ backgroundContext. mergePolicy = NSMergePolicy ( merge: NSMergePolicyType . mergeByPropertyStoreTrumpMergePolicyType)
39
+ return backgroundContext
40
+ }
41
+
42
+ private static func create( fromBundle bundle: Bundle ) -> PersistentContainer ? {
43
+ guard let managedObjectModel = createManagedObjectModel ( fromBundle: bundle) else {
33
44
ITBError ( " Could not initialize managed object model " )
34
45
return nil
35
46
}
36
-
37
47
let container = PersistentContainer ( name: PersistenceConst . dataModelFileName, managedObjectModel: managedObjectModel)
38
48
container. loadPersistentStores { desc, error in
39
49
if let error = error {
@@ -47,20 +57,29 @@ class PersistentContainer: NSPersistentContainer {
47
57
container. viewContext. mergePolicy = NSMergePolicy ( merge: NSMergePolicyType . mergeByPropertyStoreTrumpMergePolicyType)
48
58
49
59
return container
50
- } ( )
60
+ }
51
61
52
- override func newBackgroundContext( ) -> NSManagedObjectContext {
53
- let backgroundContext = super. newBackgroundContext ( )
54
- backgroundContext. automaticallyMergesChangesFromParent = true
55
- backgroundContext. mergePolicy = NSMergePolicy ( merge: NSMergePolicyType . mergeByPropertyStoreTrumpMergePolicyType)
56
- return backgroundContext
62
+ private static func createManagedObjectModel( fromBundle bundle: Bundle ) -> NSManagedObjectModel ? {
63
+ guard let url = managedObjectUrl ( fromBundle: bundle) else {
64
+ ITBError ( " Could not find \( PersistenceConst . dataModelFileName) . \( PersistenceConst . dataModelExtension) in bundle " )
65
+ return nil
66
+ }
67
+ ITBInfo ( " DB Bundle url: \( url) " )
68
+ return NSManagedObjectModel ( contentsOf: url)
69
+ }
70
+
71
+ private static func managedObjectUrl( fromBundle bundle: Bundle ) -> URL ? {
72
+ ResourceHelper . url ( forResource: PersistenceConst . dataModelFileName,
73
+ withExtension: PersistenceConst . dataModelExtension,
74
+ fromBundle: bundle)
57
75
}
58
76
}
59
77
60
78
@available ( iOS 10 . 0 , * )
61
79
struct CoreDataPersistenceContextProvider : IterablePersistenceContextProvider {
62
- init ? ( dateProvider: DateProviderProtocol = SystemDateProvider ( ) ) {
63
- guard let persistentContainer = PersistentContainer . shared else {
80
+ init ? ( dateProvider: DateProviderProtocol = SystemDateProvider ( ) ,
81
+ fromBundle bundle: Bundle = Bundle . main) {
82
+ guard let persistentContainer = PersistentContainer . initialize ( fromBundle: bundle) else {
64
83
return nil
65
84
}
66
85
self . persistentContainer = persistentContainer
0 commit comments