Date post: | 18-Oct-2014 |
Category: |
Technology |
View: | 1,527 times |
Download: | 3 times |
Core Data in MotionNSScotland 2013 - Oct 19/20
Monday, 21 October, 13
Who?
• Lori M Olson
• @wndxlori
• on Github too
• and ADN
Monday, 21 October, 13
i Develop• Ruby (mostly)
• Rails
• iOS (RubyMotion)
• JRuby
• Javascript (some)
• jQuery
• Maps/Charts
• Javascript Testing
Monday, 21 October, 13
i Teach
• Ruby on Rails for Real Developers (RoR4Real)
• Rails for iOS Developers (Rails4iOS)
• Ladies Learning Code - Ruby Introduction
Monday, 21 October, 13
i Speak• 2013
• RubyConf AU, NSScotland
• 2012
• Confoo, RailsConf, Aloha RubyConf
• 2011
• jQueryConf, Madison Ruby
• 2010
• Conferencia Rails
• 2009
• RailsConf
Monday, 21 October, 13
Warning:LOTS of code
Monday, 21 October, 13
The Story
• To rewrite a (mobile) web application (WIMBY) as an iOS application
• Using RubyMotion
• WIMBY = Wells In My Back Yard
Monday, 21 October, 13
The Challenges
• LOTS of data
• On a Map
• In a list (table view)
• Filtering by location
Monday, 21 October, 13
Oh, not much dataMonday, 21 October, 13
RubyMotion gems/DSL’s
• Nitron
• MotionDataWrapper
• MotionModel
• MotionMigrate
Monday, 21 October, 13
iOS Basics
• Ray Wenderlich!
• http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started
Monday, 21 October, 13
Problems
• RubyMotion gems/DSL’s hide a lot
• Straight iOS Objective-C development relies on Xcode magic (hides a lot)
• Complex data is complex
• Large data is large
• What do I do when I reach the limitations of these solutions?
Monday, 21 October, 13
The Real Problem
• Sometimes you just need to understand how to solve problems at the most basic API code level, and the abstractions (and magic) just get in the way
Monday, 21 October, 13
It’s not as scary as it looksMonday, 21 October, 13
What?
• Models (entities) in code
• Relationships in code
• Loading data
• Optimization
Monday, 21 October, 13
Models in code
Monday, 21 October, 13
Models in Code
• Hey, isn’t there a sample app for that?
• Locations
• https://github.com/HipByte/RubyMotionSamples/tree/master/ios/Locations
• MVCS pattern
Monday, 21 October, 13
location.rb (model)Monday, 21 October, 13
location.rb (entity)Monday, 21 October, 13
location.rb (properties)Monday, 21 October, 13
location_store.rb (store)Monday, 21 October, 13
location_store.rb (MoM)Monday, 21 October, 13
location_store.rb (psc)Monday, 21 October, 13
location_store.rb (MoC)Monday, 21 October, 13
That was easy
Monday, 21 October, 13
Or was it?
Monday, 21 October, 13
Monday, 21 October, 13
Overly simplistic
• Doesn’t work with multiple models with relationships
• You need a reference to an entity, to define a relationship fully
Monday, 21 October, 13
Chicken & Egg problemMonday, 21 October, 13
Relationships in code
http://www.slowfamilyonline.com/2011/12/slow-news-day-hooray-for-low-tech-toys/tinkertoys/
Monday, 21 October, 13
Solution
• Define your entities. First.
• Lazily! define your entities’ properties
• properties = (attributes and relationships)
Monday, 21 October, 13
Another example
• Ray Wenderlich’s Failed Bank example has 2 models
• So let’s just start there
Monday, 21 October, 13
Just the entity...Monday, 21 October, 13
MoM, lazily defined properties
Monday, 21 October, 13
attributesMonday, 21 October, 13
attributesMonday, 21 October, 13
relationshipsMonday, 21 October, 13
relationshipsMonday, 21 October, 13
The “other” modelMonday, 21 October, 13
Relationships
• Done
• With that, you can pretty much define any kind of model and relationship you want, in code, no magic required.
Monday, 21 October, 13
Data Loading
https://twitter.com/usmanm/status/388407160159211520/photo/1
Monday, 21 October, 13
iOS Core Data Basics
• Back to Ray
• http://www.raywenderlich.com/12170/core-data-tutorial-how-to-preloadimport-existing-data-updated
Monday, 21 October, 13
The RubyMotion wayMonday, 21 October, 13
Read the data file (JSON)Monday, 21 October, 13
Add data to storeMonday, 21 October, 13
add_bankMonday, 21 October, 13
That was easy
Monday, 21 October, 13
Or was it?
Monday, 21 October, 13
How many wells do I have to load again?
Monday, 21 October, 13
244,292Oh.
Monday, 21 October, 13
save for each addMonday, 21 October, 13
That won’t work
• Read in the whole file first?!?
• add, save, add, save
• horribly inefficient for large data loads
• add, add, add ...., save once
• yah, never mind
• add, add, add, save, add, add, add, save
• better, but still fails on out-of-memory
Monday, 21 October, 13
Wait, what?
Monday, 21 October, 13
Back to Core Data Basics
• Thankfully, Ray figured that out.
• Updated the tutorial to operate as an OS X (console) app.
• RubyMotion can do that, too.
Monday, 21 October, 13
New, improved loadMonday, 21 October, 13
streaming (CSV) loadMonday, 21 October, 13
create_bank (no save)Monday, 21 October, 13
saves, every 100progress every 100/1000
Monday, 21 October, 13
Catch the odd onesMonday, 21 October, 13
Ta da! 244,292 wells loaded
Monday, 21 October, 13
And then your table view chokes on 244k
items
Monday, 21 October, 13
Optimization!
http://fineartamerica.com/featured/dont-cross-the-streams-trever-miller.html
Monday, 21 October, 13
Back to Basics (again)
• Ray sure has a lot of good material, doesn’t he?
• http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller
Monday, 21 October, 13
Why?
• NSFetchedResultsController gives us huge performance benefits
• Avoids loading all the data in memory at once
Monday, 21 October, 13
bank_store.rbMonday, 21 October, 13
failed_bank_table_view_controller.rb
Monday, 21 October, 13
failed_bank_table_view_controller.rb
Monday, 21 October, 13
number of rowsMonday, 21 October, 13
cell for rowMonday, 21 October, 13
configure cellMonday, 21 October, 13
the delegateMonday, 21 October, 13
Monday, 21 October, 13
DEMO!
Monday, 21 October, 13
That’s All, Folks!
• Questions? Comments?
• https://github.com/wndxlori/WNDXRubyMotion/tree/master/FailedBankCD
• @wndxlori
• http://www.linkedin.com/in/loriolson
• http://www.wndx.com
Monday, 21 October, 13
Core Data in Motion
• It’s an ebook!
• Early pre-release
• http://coredatainmotion.com
Monday, 21 October, 13