Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Everyday CoreData
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Pat Zearfoss
March 16, 2016
Technology
0
83
Everyday CoreData
My CoreData talk at CodersOnly on March 16, 2016
Pat Zearfoss
March 16, 2016
Tweet
Share
More Decks by Pat Zearfoss
See All by Pat Zearfoss
CircleBack and WWDC 2015
pzearfoss
0
34
Other Decks in Technology
See All in Technology
Mitigating geopolitical risks with local-first software and atproto
ept
0
160
「通るまでRe-run」から卒業!落ちないテストを書く勘所
asumikam
2
450
AIエージェント×GitHubで実現するQAナレッジの資産化と業務活用 / QA Knowledge as Assets with AI Agents & GitHub
tknw_hitsuji
0
150
20年以上続く PHP 大規模プロダクトを Kubernetes へ ── クラウド基盤刷新プロジェクトの4年間
oogfranz
PRO
0
160
AWS Systems Managerのハイブリッドアクティベーションを使用したガバメントクラウド環境の統合管理
toru_kubota
0
130
エンジニアリングマネージャーの仕事
yuheinakasaka
0
120
AgentCoreとLINEを使った飲食店おすすめアプリを作ってみた
yakumo
2
170
中央集権型を脱却した話 分散型をやめて、連邦型にたどり着くまで
sansantech
PRO
1
190
How to install a gem
indirect
0
150
会社紹介資料 / Sansan Company Profile
sansan33
PRO
16
410k
【Λ(らむだ)】最近のアプデ情報 / RPALT20260318
lambda
0
150
GitHub Copilot CLI で Azure Portal to Bicep
tsubakimoto_s
0
160
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
150
How STYLIGHT went responsive
nonsquared
100
6k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
The Spectacular Lies of Maps
axbom
PRO
1
640
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
How to Ace a Technical Interview
jacobian
281
24k
The Invisible Side of Design
smashingmag
302
51k
Utilizing Notion as your number one productivity tool
mfonobong
4
270
Transcript
Everyday CoreData Pat Zearfoss
About Me • Pat Zearfoss • CircleBack on the app
store • Running on a CoreData stack for better than a year. • @patzearfoss on Twitter.
End User License Agreement • My suggestions may not be
100% right for all situations • CoreData elicits a lot of opinions in the community. • Your app may not fit the same patterns and models
Lets Go
Things I’ll talk about • Frameworks and tools • Model
design • App architecture • Testing • Debugging tools
CoreData Review
CoreData Review • A way of persisting data in Cocoa
applications • Not a database • Well, it kind of is, but not necessarily • On label usage is “object graph persistence”
Object Graph
CoreData Pieces • NSManagedObjectModel • NSPesistentStoreCoordinator • NSManagedObjectContext • NSManagedObject
Tip #1 Once you understand CoreData, use a framework (or
write one) to make life easier.
There’s tons • Magical Record • BNRCoreData • RestKit
Why • It’ll help you simplify all the stuff you’ll
do anyway. • CoreData can be . . . wordy.
Creating a new instance if let eDesc = NSEntityDescription.entityForName(“Contact”, inManagedObjectContext:
context) { let contact1 = Contact(entity: contactDescription, insertIntoManagedObjectContext:context) }
A basic fetch let fetchRequest = NSFetchRequest(entityName: “Contact”) fetchRequest.sortDescriptors =
[NSSortDescriptor(key: “lastName”, ascending: true)] fetchRequest.predicate = NSPredicate(format: “isFavorite = YES”) if let context = context { do { try contacts = context. executeFetchRequest(fetchRequest) as! [Contact] } catch { print (“couldn’t load contacts”) } }
The app delegate eyebleed
Creating an instance - MR if let contact1 = Contact.MR_createEntityInContext(context)
Fetch if let fetchedContacts = Contact.MR_findAllSortedBy(“lastName”, ascending: true, inContext: context) as? [Contact]
Eyebleed cured MagicalRecord.setupCoreDataStack()
Demo 1
More tools • SimPholders • CoreDataEditor • SQLPro or other
Sqlite tool
Modeling • Your managed model is a database, but it
also isn’t. You have to make it work right for you.
Tip #2 Design for your app. Don’t feel the need
to appease the database gods.
Demo 2
Tip #3 Use NSManagedObjectContexts liberally • Creating a new context
to fetch objects, passing the ids to a main context for use on the UI. • Doing expensive operations in background queues • Creating a throw-away editing context.
Demo 3
Tip #4 NSFetchedResultsController can be your best friend • NSFetchedResultsController
manages the results of a fetch into a context.
NSFetchedResultsController • Keeping a UI updated with changes from the
internet. • Use fetched results controllers to manage all communication with a web backend.
Demo 4
Architectural patterns from fetched results controllers
None
Testing • You don’t really care about persistence • You
just want to test this object, controller, view model, etc.
Tip #5 Use an in-memory store for testing • Sets
up the same scheme you have in memory. • Quick and easy to set up an tear down between tests
Demo 5
Debugging
Tip #6 Learn and use the CoreData environment variables
Useful environment variables • com.apple.CoreData.SQLDebug [1,2,3] • com.apple.CoreData.SyntaxColoredLogging 1 •
com.apple.CoreData.ConcurrencyDebug 1 • (not ThreadDebug) • com.apple.CoreData.MigrationDebug
Demo 6
Tip #7 Use the CoreData tool in instruments
Demo 7 CircleBack App
Tip #8 Other people have really good ideas • Saul
Mora - original author of MagicalRecord • Marcus Zarra - wrote many a book on CoreData • objc.io on CoreData • WWDC Material (obvi)
Recap • Find a good framework to help you. •
Design a model that fits your app’s needs • Make use of NSManagedObjectContext • Use NSFetchedResultsControllers
Recap • Use in memory stores for testing • CoreData
runtime arguments are your friend • Make use of Instruments • Read good material
?s and Thanks! •
[email protected]
• @patzearfoss