Core Data Model
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Slide 19
Slide 19 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Core Data Model
Slide 20
Slide 20 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 21
Slide 21 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
“Route” Entity
“City” Entity
Slide 22
Slide 22 text
entity |ˈɛntɪti|
noun ( pl. entities )
a thing with distinct and independent
existence: Church and empire were fused in a single
entity.
“Route” Entity
“City” Entity
Slide 23
Slide 23 text
Model &
Relationships
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 24
Slide 24 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 25
Slide 25 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Data
Slide 26
Slide 26 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 27
Slide 27 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Relationships
Slide 28
Slide 28 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 29
Slide 29 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Boring Part
Slide 30
Slide 30 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 31
Slide 31 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Where the Fun
Happens
Slide 32
Slide 32 text
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 33
Slide 33 text
Context
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
Slide 34
Slide 34 text
NSManagedObjectContext
Berlin
Bilbao
Logroño
Paris
San
Francisco
Copenhagen
Denmark
WWDC
NSSpain
NSManagedObjectContext
Berlin
Bilbao
Logroño
NSSpain
Relationships
NSSpain
Route *nsspain = ...
cities = nsspain.cities;
Slide 41
Slide 41 text
Relationships
cities = nsspain.cities;
Berlin
Bilbao
Logroño
NSSpain
Slide 42
Slide 42 text
Relationships
cities = nsspain.cities;
Berlin
Bilbao
Logroño
NSSpain
berlin = cities[0];
Slide 43
Slide 43 text
Relationships
cities = nsspain.cities;
Berlin
Bilbao
Logroño
NSSpain
berlin = cities[0];
otherRoutes = berlin.routes;
Slide 44
Slide 44 text
Berlin
Bilbao
Logroño
Denmark
WWDC
NSSpain
Relationships
cities = nsspain.cities;
Berlin
Bilbao
Logroño
NSSpain
berlin = cities[0];
otherRoutes = berlin.routes;
NSFetchRequest
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 53
Slide 53 text
NSFetchRequest
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 54
Slide 54 text
Traversing
Relationship
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 55
Slide 55 text
Traversing
Relationship
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 56
Slide 56 text
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 57
Slide 57 text
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 58
Slide 58 text
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Expensive
Slide 59
Slide 59 text
Never use
NSFetchRequest,
right?
Slide 60
Slide 60 text
When to use
NSFetchRequest
• Searching
• All objects
• Pre-fetching
Slide 61
Slide 61 text
Searching
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 62
Slide 62 text
Searching
• NSFetchRequest allows you to set a predicate
• NSPredicate specify what you want to fetch
• Target your search
• Less I/O → better performance
• Only bring in those objects you want
• Core Data doesn’t have to pull in data you don’t
need
Slide 63
Slide 63 text
Searching
• Check Xcode documentation called
“Core Data Snippets”
for a lot of good info on predicates.
Slide 64
Slide 64 text
All Objects
• Showing a list of all objects to the user
• UITableView
• UICollectionView
• You must not bring in all objects at once
• You must not bring in each object on its own
Slide 65
Slide 65 text
All Objects
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 66
Slide 66 text
All Objects
• Use “batching”:
fetchRequest.fetchBatchSize = 40;
depends on
your app
Slide 67
Slide 67 text
All Objects
fetchRequest.fetchBatchSize = 3;
don’t use 3
in a real app
1 2 3 4 5 6 7 8 9 10 11 12
Slide 68
Slide 68 text
All Objects
fetchRequest.fetchBatchSize = 3;
don’t use 3
in a real app
1 2 3 4 5 6 7 8 9 10 11 12
Slide 69
Slide 69 text
All Objects
fetchRequest.fetchBatchSize = 3;
don’t use 3
in a real app
1 2 3 4 5 6 7 8 9 10 11 12
Slide 70
Slide 70 text
All Objects
fetchRequest.fetchBatchSize = 3;
don’t use 3
in a real app
1 2 3 4 5 6 7 8 9 10 11 12
Slide 71
Slide 71 text
All Objects
fetchRequest.fetchBatchSize = 3;
don’t use 3
in a real app
1 2 3 4 5 6 7 8 9 10 11 12
Slide 72
Slide 72 text
Pre-Fetching
• Round tripping to the Database is Expensive
• Fetch as much as possible in 1 go
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 73
Slide 73 text
Pre-Fetching
• Execute an NSFetchRequest without using its
result. Just to bring objects into the context
• Only do this when you need to.
• Don’t fetch objects if they’re already in the
context (or the persistent store coordinator’s
row cache)
• Measure
• Don’t prematurely optimize
Performance Issues
Top 3
• Loading too much data
• Not loading enough data
• Inefficient queries
These 3 are a problem in any database application,
not just Core Data, but people like to blame Core
Data.
Slide 77
Slide 77 text
Loading
too much data
• Loading everything is BAD
• batching
• aggregating
• Sorting and filtering in memory is BAD
• predicates
• sort descriptors
Slide 78
Slide 78 text
Not loading
enough data
• Round trips to the file system are SLOW
• Relationship prefetching
Slide 79
Slide 79 text
Inefficient Queries
• Use indexes
Slide 80
Slide 80 text
Inefficient Queries
• Unicode text searching is expensive, but necessary
• normalize text (uppercase, diacritics)
• ‘like’ is expensive!
• beginswith and contains are a lot faster
than like
Slide 81
Slide 81 text
Inefficient Queries
• Order of predicates matters!
• Cheap stuff at the beginning
• Relationships at the end
• Xcode Documentation: “Predicates” Guide
Slide 82
Slide 82 text
Performance
Debugging
-com.apple.CoreData.SQLDebug 1
and / or
EXPLAIN QUERY PLAN ...
Multi-Context
Multi-Store
Core Data support various, complex setups
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 85
Slide 85 text
Multi-Context
NSPersistent
StoreCoordinator
SQLite
File
System
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
Contexts are distinct — distinct changes.
NSManagedObject tied to their owning context.
Slide 86
Slide 86 text
Multi-Store
No relations across stores.
NSPersistent
StoreCoordinator
SQLite
File
System
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
NSPersistent
Store
NSPersistent
Store
SQLite
File
System
SQLite
File
System
Slide 87
Slide 87 text
Multi-Stack
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 88
Slide 88 text
Mixing everything
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
NSPersistent
StoreCoordinator
SQLite
File
System
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
NSPersistent
Store
NSPersistent
Store
SQLite
File
System
SQLite
File
System
Slide 89
Slide 89 text
Complex Stacks
• Very, very flexible
• Also adds a lot of complexity
• Threading is always complex
• You NEED a merging policy
• You can almost always do without
• Save yourself the trouble — go for simple
Slide 90
Slide 90 text
Parent-Child Context
• Don’t use it — it’s more complicated than it seems
• Implemented to facilitate deferred saving
(UIManagedDocument)
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
Slide 91
Slide 91 text
Parent-Child Context
• There’s a lot of locking that NEEDS to happen
• NSManagedObjectID behaves differently
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
Slide 92
Slide 92 text
Incremental Store
• Don’t use it — it’s (a lot) more complicated than it
seems
Slide 93
Slide 93 text
Incremental Store
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSPersistent
Store
SQLite
File
System
Slide 94
Slide 94 text
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
Your
own
code
here
?
Incremental Store
Slide 95
Slide 95 text
NSPersistent
StoreCoordinator
NSManagedObjectContext
NSManaged
Object
NSManaged
Object
NSManaged
Object
NSManaged
Object
Your
own
code
here
?
Incremental Store
• Transactional ?!?
• Threading / Async ?!?
Why Core Data?
• Very mature code base — more than 8 years
• Battle tested
• Very performant if used right
Slide 98
Slide 98 text
Covered Today
• What is Core Data?
• Core Data Stack & Data Model
• Relationships
• Getting Data from Core Data
• Performance
• Advanced Core Data
Slide 99
Slide 99 text
More
Information
• Check the Xcode Documentation
• “Core Data Starting Point”
• “Core Data Programming Guide”
• “Core Data Snippets”
• http://www.objc.io/issue-4/
Slide 100
Slide 100 text
Daniel Eggert
@danielboedewadt
http://www.objc.io/
Senior Software Developer
Zeta Project GmbH, Berlin
We’re hiring!