multi-threaded coredata done right

63
Multi-threaded Core Data Done Right Andrew Morrow

Upload: morrowade

Post on 24-Jan-2015

385 views

Category:

Engineering


2 download

DESCRIPTION

Slides from my 360|iDev talk on how to concurrently fetch, parse, and save data while allowing user interaction to continue smoothly.

TRANSCRIPT

Page 1: Multi-threaded CoreData Done Right

Multi-threaded Core Data Done Right

Andrew Morrow

Page 2: Multi-threaded CoreData Done Right

Multi-threaded Core Data Done Right

Andrew Morrow

Page 3: Multi-threaded CoreData Done Right

Let’s Build a CoreData Stack!

Page 4: Multi-threaded CoreData Done Right

Goals

1. Never block UI interaction

2. Efficiently handle large datasets

3. Display updated data immediately

4. Avoid data merge conflicts

Page 5: Multi-threaded CoreData Done Right

First Try (Demo)

Page 6: Multi-threaded CoreData Done Right

What Went Wrong?

Page 7: Multi-threaded CoreData Done Right

Main Queue Background Queue

Page 8: Multi-threaded CoreData Done Right

getAsynchronous

Main Queue Background Queue

Page 9: Multi-threaded CoreData Done Right

getAsynchronous

Main Queue Background Queue

Network Request

Page 10: Multi-threaded CoreData Done Right

getAsynchronous

dispatch_async

Main Queue Background Queue

Main Queue MOC

Network Request

Page 11: Multi-threaded CoreData Done Right

getAsynchronous

dispatch_async

! Parse and Save

Main Queue Background Queue

Main Queue MOC

Network Request

Page 12: Multi-threaded CoreData Done Right

getAsynchronous

dispatch_async

! Parse and Save

User Interaction

Main Queue Background Queue

Main Queue MOC

Network Request

Page 13: Multi-threaded CoreData Done Right

Move Parsing and Saving onto a Background Queue

(Demo)

Page 14: Multi-threaded CoreData Done Right

What Went Wrong?

Page 15: Multi-threaded CoreData Done Right

Main Queue Background Queue

Page 16: Multi-threaded CoreData Done Right

getAsynchronous

Main Queue Background Queue

Page 17: Multi-threaded CoreData Done Right

getAsynchronous

Main Queue Background Queue

Network Request

Page 18: Multi-threaded CoreData Done Right

getAsynchronous

performBlock

Main Queue Background Queue

Background MOC

Network Request

Page 19: Multi-threaded CoreData Done Right

getAsynchronous

performBlock

Parse and Save? User Interaction

Main Queue Background Queue

Background MOC

Network Request

Page 20: Multi-threaded CoreData Done Right

getAsynchronous

performBlock

Parse and Save? User Interaction

Main Queue Background Queue

Background MOC

Network Request?!

Page 21: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 22: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 23: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 24: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 25: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 26: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 27: Multi-threaded CoreData Done Right

Solution: Multiple Persistent Store Coordinators

Page 28: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Page 29: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Page 30: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Page 31: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Read-Only

Page 32: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Read-Only

Page 33: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Read-Only

Page 34: Multi-threaded CoreData Done Right

Main Queue MOC

Background MOC

Persistent Store Coordinator

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Persistent Store Coordinator

Read-Only Read-Write

Page 35: Multi-threaded CoreData Done Right

Write-Ahead Logging (WAL)

1 2 3 4 5

Reader(s)

Page 36: Multi-threaded CoreData Done Right

Write-Ahead Logging (WAL)

1 2 3 4 5

Reader(s)

6

Writer

Page 37: Multi-threaded CoreData Done Right

Write-Ahead Logging (WAL)

1 2 3 4 5

Reader(s)

6

Page 38: Multi-threaded CoreData Done Right

Write-Ahead Logging (WAL)

1 2 3 4 5

Reader(s)

6

Page 39: Multi-threaded CoreData Done Right

Write-Ahead Logging (WAL) (cont.)

SQLite feature

Multiple concurrent reads

One concurrent write

Shared memory between readers and writers for synchronization

Page 40: Multi-threaded CoreData Done Right

Good News!

Page 41: Multi-threaded CoreData Done Right

Good News!@{NSSQLitePragmasOption: @{@"journal_mode": @"WAL"}}

Page 42: Multi-threaded CoreData Done Right

Parallel Persistent Store Coordinators

(Demo)

Page 43: Multi-threaded CoreData Done Right

What Went Wrong?

Page 44: Multi-threaded CoreData Done Right

Updating the Main Thread

Main Queue MOC

Background MOC

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Page 45: Multi-threaded CoreData Done Right

Updating the Main Thread

Main Queue MOC

Background MOC

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Background MOC

Page 46: Multi-threaded CoreData Done Right

Updating the Main Thread

Main Queue MOC

Background MOC

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Background MOC

SQLite

Page 47: Multi-threaded CoreData Done Right

Updating the Main Thread

Main Queue MOC

Background MOC

User Interaction (Fetched Results Controller)

SQLite

Remote Data Refresh (Parse and Save)

Background MOC

SQLite

Page 48: Multi-threaded CoreData Done Right

Updating the Main Thread (Cont.)Merging changes from notifications

Batched saves

Custom notifications

Completion blocks

NSManagedObjectID

Page 49: Multi-threaded CoreData Done Right

Updating the Main Thread (Demo)

Page 50: Multi-threaded CoreData Done Right

Avoiding Merge Conflicts

Serialize CoreData write access

Keep main thread read-only

Page 51: Multi-threaded CoreData Done Right

SQLite (Jennifer)

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC (Jennifer)

Page 52: Multi-threaded CoreData Done Right

SQLite (Jennifer)

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC (Jennifer)

Background MOC (Jen)

Page 53: Multi-threaded CoreData Done Right

SQLite (Jennifer)

SQLite (Jen)

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC (Jennifer)

Background MOC (Jen)

Page 54: Multi-threaded CoreData Done Right

SQLite (Jennifer)

SQLite (Jen)

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC (Jennifer)

Background MOC (Jen)

Main Queue MOC (Jen)

Page 55: Multi-threaded CoreData Done Right

SQLite (Jennifer)

SQLite (Jen)

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC (Jennifer)

Background MOC (Jen)

Main Queue MOC (Jen)

Page 56: Multi-threaded CoreData Done Right

→ Jen

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC Queue

→ Jen

SQLite (Jennifer)

Page 57: Multi-threaded CoreData Done Right

→ Jen

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC Queue

→ Jen

SQLite (Jennifer)

Page 58: Multi-threaded CoreData Done Right

→ Jen

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC Queue

→ Jen

SQLite (Jennifer)

SQLite (Jen)

Page 59: Multi-threaded CoreData Done Right

→ Jen

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC Queue

→ Jen

SQLite (Jennifer)

SQLite (Jen)

Main Queue MOC (Jen)

Page 60: Multi-threaded CoreData Done Right

→ Jen

Main Queue MOC (Jennifer)

User Interaction Jennifer → Jen

Remote Data Refresh Jennifer → Jen

Background MOC Queue

→ JenSQLite (Jennifer)

SQLite (Jen)

Main Queue MOC (Jen)

Page 61: Multi-threaded CoreData Done Right

Summary

Let SQLite handle your concurrency

Only allow one concurrent write

Keep your main thread read-only

“CoreData Performance” Tim Isted, WWDC 2013 #211

Page 62: Multi-threaded CoreData Done Right

Questions

Page 63: Multi-threaded CoreData Done Right

Questions