Slide 1

Slide 1 text

Core Data — best practices Daniel Eggert NSSpain, Logroño September 18, 2013

Slide 2

Slide 2 text

Daniel Eggert Me & Core Data

Slide 3

Slide 3 text

Agenda • What is Core Data? • Core Data Stack & Data Model • Relationships • Getting Data from Core Data • Performance • Advanced Core Data

Slide 4

Slide 4 text

What is Core Data?

Slide 5

Slide 5 text

What is Core Data? • Objective-C • Mature Code Base — 8 years in the wild • OS X since 10.4 • iOS since iOS 3 • No UI

Slide 6

Slide 6 text

What is Core Data? • (Very powerful) object graph management • Persistency technology • Not an SQL wrapper • Not a Object-relational mapping (O/RM)

Slide 7

Slide 7 text

Meet the Stack

Slide 8

Slide 8 text

Core Data Stack NSManaged Object NSManaged Object NSManaged Object NSManaged Object

Slide 9

Slide 9 text

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 Core Data Stack

Slide 10

Slide 10 text

Core Data Stack NSPersistent StoreCoordinator NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSManaged Object NSPersistent Store SQLite File System

Slide 11

Slide 11 text

Core Data Stack NSPersistent StoreCoordinator NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSManaged Object NSPersistent Store SQLite File System { { Object Graph Management Persistence

Slide 12

Slide 12 text

Core Data Stack 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 13

Slide 13 text

Core Data Stack NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSManaged Object

Slide 14

Slide 14 text

Core Data Stack NSManagedObjectContext NSManaged Object NSManaged Object NSManaged Object NSManaged Object

Slide 15

Slide 15 text

Meet the Model

Slide 16

Slide 16 text

© Jimmy Rodriguez www.jimmy-rodriguez.book.fr

Slide 17

Slide 17 text

Core Data Model

Slide 18

Slide 18 text

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

Slide 35

Slide 35 text

Relationships

Slide 36

Slide 36 text

Relationships

Slide 37

Slide 37 text

Relationships Object Graph Management

Slide 38

Slide 38 text

Relationships NSSpain Route *nsspain = ...

Slide 39

Slide 39 text

Relationships NSSpain Route *nsspain = ... cities = nsspain.cities;

Slide 40

Slide 40 text

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;

Slide 45

Slide 45 text

Relationships Route *nsspain = ... NSOrderedSet *cities = nsspain.cities; City *berlin = cities[0]; NSSet *otherRoutes = berlin.routes;

Slide 46

Slide 46 text

Getting Data from Core Data © Phil Hobgen http://500px.com/philhobgen

Slide 47

Slide 47 text

Use Relationships

Slide 48

Slide 48 text

Use Relationships Really!

Slide 49

Slide 49 text

Use Relationships Really! Really!

Slide 50

Slide 50 text

NSFetchRequest

Slide 51

Slide 51 text

NSFetchRequest What does a do?

Slide 52

Slide 52 text

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

Slide 74

Slide 74 text

Pre-Fetching NSManagedObject *mo = ...; mo.isFault [mo hasFaultForRelationshipNamed:]

Slide 75

Slide 75 text

Performance © John Bender http://500px.com/bendersama

Slide 76

Slide 76 text

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 ...

Slide 83

Slide 83 text

© Derek Bruff http://500px.com/derekbruff Advanced Core Data

Slide 84

Slide 84 text

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 ?!?

Slide 96

Slide 96 text

Why Core Data? • Relationships • Delete Propagation • Change Tracking and Undo • Scratchpad • Faulting • Uniquing

Slide 97

Slide 97 text

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!

Slide 101

Slide 101 text

A & Q NSSpain