We’ve been using the save()
method of NSManagedObjectContext
to flush out all unsaved changes to permanent storage, but what we haven’t done is check whether any changes actually need to be saved. This is often OK, because it’s common to place save()
calls only after we specifically made a change such as inserting or deleting data.
However, it’s also common to bulk your saves together so that you save everything at once, which has a lower performance impact. In fact, Apple specifically states that we should always check for uncommitted changes before calling save()
, to avoid making Core Data do work that isn’t required.
Fortunately, we can check for changes in two ways. First, every managed object is given a hasChanges
property, that is true when the object has unsaved changes. And, the entire context also contains a hasChanges
property that checks whether any object owned by the context has changes.
So, rather than call save()
directly you should always wrap it in a check first, like this:
if moc.hasChanges {
try? moc.save()
}
It’s a small change to make, but it matters – there’s no point doing work that isn’t needed, no matter how small, particularly because if you do enough small work you realize you’ve stacked up some big work.
SPONSORED Alex is the iOS & Mac developer’s ultimate AI assistant. It integrates with Xcode, offering a best-in-class Swift coding agent. Generate modern SwiftUI from images. Fast-apply suggestions from Claude 3.5 Sonnet, o3-mini, and DeepSeek R1. Autofix Swift 6 errors and warnings. And so much more. Start your 7-day free trial today!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.