Skip to content

Commit d69c8c9

Browse files
authored
Merge pull request #19185 from wordpress-mobile/core-data-adopt-the-new-writer-api
Adopt the new Core Data writer API
2 parents 1910f8a + bfeb5f2 commit d69c8c9

8 files changed

Lines changed: 30 additions & 50 deletions

File tree

WordPress/Classes/Services/BloggingPromptsService.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -331,15 +331,12 @@ private extension BloggingPromptsService {
331331
/// - remoteSettings: The blogging prompt settings from the remote.
332332
/// - completion: Closure to be called on completion.
333333
func saveSettings(_ remoteSettings: RemoteBloggingPromptsSettings, completion: @escaping () -> Void) {
334-
let derivedContext = contextManager.newDerivedContext()
335-
derivedContext.perform {
334+
contextManager.performAndSave { derivedContext in
336335
let settings = self.loadSettings(context: derivedContext) ?? BloggingPromptSettings(context: derivedContext)
337336
settings.configure(with: remoteSettings, siteID: self.siteID.int32Value, context: derivedContext)
338-
339-
self.contextManager.save(derivedContext) {
340-
DispatchQueue.main.async {
341-
completion()
342-
}
337+
} completion: {
338+
DispatchQueue.main.async {
339+
completion()
343340
}
344341
}
345342
}

WordPress/Classes/Services/CommentService+Likes.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,23 @@ private extension CommentService {
9090

9191
guard let remoteLikeUsers = remoteLikeUsers,
9292
!remoteLikeUsers.isEmpty else {
93-
onComplete()
93+
DispatchQueue.main.async {
94+
onComplete()
95+
}
9496
return
9597
}
9698

97-
let derivedContext = ContextManager.shared.newDerivedContext()
98-
99-
derivedContext.perform {
100-
99+
ContextManager.shared.performAndSave { derivedContext in
101100
let likers = remoteLikeUsers.map { remoteUser in
102101
LikeUserHelper.createOrUpdateFrom(remoteUser: remoteUser, context: derivedContext)
103102
}
104103

105104
if purgeExisting {
106105
self.deleteExistingUsersFor(commentID: commentID, siteID: siteID, from: derivedContext, likesToKeep: likers)
107106
}
108-
109-
ContextManager.shared.save(derivedContext) {
110-
DispatchQueue.main.async {
111-
onComplete()
112-
}
107+
} completion: {
108+
DispatchQueue.main.async {
109+
onComplete()
113110
}
114111
}
115112
}

WordPress/Classes/Services/LikeUserHelpers.swift

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,8 @@ import CoreData
5959
}
6060

6161
class func purgeStaleLikes() {
62-
let derivedContext = ContextManager.shared.newDerivedContext()
63-
64-
derivedContext.perform {
65-
purgeStaleLikes(fromContext: derivedContext)
66-
ContextManager.shared.save(derivedContext)
62+
ContextManager.shared.performAndSave {
63+
purgeStaleLikes(fromContext: $0)
6764
}
6865
}
6966

WordPress/Classes/Services/PlanService.swift

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,7 @@ extension PlanService {
236236

237237
struct PlanStorage {
238238
static func activatePlan(_ planID: Int, forSite siteID: Int) {
239-
let manager = ContextManager.sharedInstance()
240-
let context = manager.newDerivedContext()
241-
242-
context.performAndWait {
239+
ContextManager.shared.performAndSave { context in
243240
guard let blog = try? Blog.lookup(withID: siteID, in: context) else {
244241
let error = "Tried to activate a plan for a non-existing site (ID: \(siteID))"
245242
assertionFailure(error)
@@ -248,16 +245,12 @@ struct PlanStorage {
248245
}
249246
if blog.planID?.intValue != planID {
250247
blog.planID = NSNumber(value: planID)
251-
manager.saveContextAndWait(context)
252248
}
253249
}
254250
}
255251

256252
static func updateHasDomainCredit(_ planID: Int, forSite siteID: Int, hasDomainCredit: Bool) {
257-
let manager = ContextManager.sharedInstance()
258-
let context = manager.newDerivedContext()
259-
260-
context.performAndWait {
253+
ContextManager.shared.performAndSave { context in
261254
guard let blog = try? Blog.lookup(withID: siteID, in: context) else {
262255
let error = "Tried to update a plan for a non-existing site (ID: \(siteID))"
263256
assertionFailure(error)
@@ -266,7 +259,6 @@ struct PlanStorage {
266259
}
267260
if blog.hasDomainCredit != hasDomainCredit {
268261
blog.hasDomainCredit = hasDomainCredit
269-
manager.saveContextAndWait(context)
270262
}
271263
}
272264
}

WordPress/Classes/Services/PostService+Likes.swift

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,26 +90,23 @@ private extension PostService {
9090

9191
guard let remoteLikeUsers = remoteLikeUsers,
9292
!remoteLikeUsers.isEmpty else {
93-
onComplete()
93+
DispatchQueue.main.async {
94+
onComplete()
95+
}
9496
return
9597
}
9698

97-
let derivedContext = ContextManager.shared.newDerivedContext()
98-
99-
derivedContext.perform {
100-
99+
ContextManager.shared.performAndSave { derivedContext in
101100
let likers = remoteLikeUsers.map { remoteUser in
102101
LikeUserHelper.createOrUpdateFrom(remoteUser: remoteUser, context: derivedContext)
103102
}
104103

105104
if purgeExisting {
106105
self.deleteExistingUsersFor(postID: postID, siteID: siteID, from: derivedContext, likesToKeep: likers)
107106
}
108-
109-
ContextManager.shared.save(derivedContext) {
110-
DispatchQueue.main.async {
111-
onComplete()
112-
}
107+
} completion: {
108+
DispatchQueue.main.async {
109+
onComplete()
113110
}
114111
}
115112
}

WordPress/Classes/Utility/ContextManager.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ FOUNDATION_EXTERN NSString * const ContextManagerModelNameCurrent;
1616
- (void)saveContextAndWait:(NSManagedObjectContext *)context;
1717
- (void)saveContext:(NSManagedObjectContext *)context;
1818
- (void)saveContext:(NSManagedObjectContext *)context withCompletionBlock:(void (^)(void))completionBlock;
19-
- (void)saveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock;
20-
- (void)saveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock completion:(void (^)(void))completion;
19+
- (void)performAndSaveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock;
20+
- (void)performAndSaveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock completion:(void (^)(void))completion;
2121
@end
2222

2323
@interface ContextManager : NSObject <CoreDataStack>

WordPress/Classes/Utility/ContextManager.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ - (void)mergeChanges:(NSManagedObjectContext *)context fromContextDidSaveNotific
195195
}];
196196
}
197197

198-
- (void)saveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock
198+
- (void)performAndSaveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock
199199
{
200200
NSManagedObjectContext *context = [self newDerivedContext];
201201
[context performBlockAndWait:^{
@@ -205,7 +205,7 @@ - (void)saveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock
205205
}];
206206
}
207207

208-
- (void)saveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock completion:(void (^)(void))completion
208+
- (void)performAndSaveUsingBlock:(void (^)(NSManagedObjectContext *context))aBlock completion:(void (^)(void))completion
209209
{
210210
NSManagedObjectContext *context = [self newDerivedContext];
211211
[context performBlock:^{

WordPress/WordPressTest/ContextManagerTests.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ class ContextManagerTests: XCTestCase {
187187
}
188188
XCTAssertEqual(numberOfAccounts(), 0)
189189

190-
await contextManager.save { context in
190+
await contextManager.performAndSave { context in
191191
let account = WPAccount(context: context)
192192
account.userID = 1
193193
account.username = "First User"
@@ -202,7 +202,7 @@ class ContextManagerTests: XCTestCase {
202202
// From: https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md#overloading-and-overload-resolution
203203
// > "In non-async functions, and closures without any await expression, the compiler selects the non-async overload"
204204
let sync: () -> Void = {
205-
contextManager.save { context in
205+
contextManager.performAndSave { context in
206206
let account = WPAccount(context: context)
207207
account.userID = 2
208208
account.username = "Second User"
@@ -226,12 +226,12 @@ class ContextManagerTests: XCTestCase {
226226
self.expectation(description: "Second User is saved"),
227227
]
228228

229-
contextManager.save {
229+
contextManager.performAndSave {
230230
let account = WPAccount(context: $0)
231231
account.userID = 1
232232
account.username = "First User"
233233

234-
contextManager.save {
234+
contextManager.performAndSave {
235235
let account = WPAccount(context: $0)
236236
account.userID = 2
237237
account.username = "Second User"

0 commit comments

Comments
 (0)