Skip to content

Commit 94359ba

Browse files
Merge pull request #454 from Iterable/bug/mob-2614-core-data-init
[MOB-2614] - Offline mode not initialized when including IterableSDK from a framework bundle.
2 parents 96c7658 + 288c5f4 commit 94359ba

File tree

7 files changed

+43
-22
lines changed

7 files changed

+43
-22
lines changed

swift-sdk/Internal/IterableCoreDataPersistence.swift

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,27 @@ enum PersistenceConst {
2323

2424
@available(iOS 10.0, *)
2525
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)
3031
}
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 {
3344
ITBError("Could not initialize managed object model")
3445
return nil
3546
}
36-
3747
let container = PersistentContainer(name: PersistenceConst.dataModelFileName, managedObjectModel: managedObjectModel)
3848
container.loadPersistentStores { desc, error in
3949
if let error = error {
@@ -47,20 +57,29 @@ class PersistentContainer: NSPersistentContainer {
4757
container.viewContext.mergePolicy = NSMergePolicy(merge: NSMergePolicyType.mergeByPropertyStoreTrumpMergePolicyType)
4858

4959
return container
50-
}()
60+
}
5161

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)
5775
}
5876
}
5977

6078
@available(iOS 10.0, *)
6179
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 {
6483
return nil
6584
}
6685
self.persistentContainer = persistentContainer

tests/endpoint-tests/OfflineModeE2ETests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class OfflineModeEndpointTests: XCTestCase {
116116
private static let pushTemplateId = Environment.pushTemplateId!
117117
private static let inAppCampaignId = Environment.inAppCampaignId!
118118
private lazy var persistenceContextProvider: IterablePersistenceContextProvider = {
119-
let provider = CoreDataPersistenceContextProvider()!
119+
let provider = CoreDataPersistenceContextProvider(fromBundle: Bundle(for: PersistentContainer.self))!
120120
return provider
121121
}()
122122
}

tests/offline-events-tests/RequestHandlerTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -941,7 +941,8 @@ class RequestHandlerTests: XCTestCase {
941941
private let dateProvider = MockDateProvider()
942942

943943
private lazy var persistenceContextProvider: IterablePersistenceContextProvider = {
944-
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider)!
944+
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider,
945+
fromBundle: Bundle(for: PersistentContainer.self))!
945946
return provider
946947
}()
947948
}

tests/offline-events-tests/TaskProcessorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ class TaskProcessorTests: XCTestCase {
255255
appPackageName: Bundle.main.appPackageName ?? "")
256256

257257
private lazy var persistenceProvider: IterablePersistenceContextProvider = {
258-
let provider = CoreDataPersistenceContextProvider()!
258+
let provider = CoreDataPersistenceContextProvider(fromBundle: Bundle(for: PersistentContainer.self))!
259259
try! provider.mainQueueContext().deleteAllTasks()
260260
try! provider.mainQueueContext().save()
261261
return provider

tests/offline-events-tests/TaskRunnerTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ class TaskRunnerTests: XCTestCase {
334334
appPackageName: Bundle.main.appPackageName ?? "")
335335

336336
private lazy var persistenceContextProvider: IterablePersistenceContextProvider = {
337-
let provider = CoreDataPersistenceContextProvider()!
337+
let provider = CoreDataPersistenceContextProvider(fromBundle: Bundle(for: PersistentContainer.self))!
338338
return provider
339339
}()
340340
}

tests/offline-events-tests/TaskSchedulerTests.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ class TaskSchedulerTests: XCTestCase {
5959
appPackageName: Bundle.main.appPackageName ?? "")
6060

6161
private lazy var persistenceContextProvider: IterablePersistenceContextProvider = {
62-
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider)!
62+
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider,
63+
fromBundle: Bundle(for: PersistentContainer.self))!
6364
return provider
6465
}()
6566

tests/offline-events-tests/TasksCRUDTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,10 @@ class TasksCRUDTests: XCTestCase {
167167
private let dateProvider = MockDateProvider()
168168

169169
private lazy var persistenceProvider: IterablePersistenceContextProvider = {
170-
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider)!
170+
let provider = CoreDataPersistenceContextProvider(dateProvider: dateProvider,
171+
fromBundle: Bundle(for: PersistentContainer.self))!
171172
try! provider.mainQueueContext().deleteAllTasks()
172173
try! provider.mainQueueContext().save()
173174
return provider
174175
}()
175176
}
176-

0 commit comments

Comments
 (0)