SlideShare ist ein Scribd-Unternehmen logo
1 von 139
Downloaden Sie, um offline zu lesen
High Performance
Core Data
HighPerformanceCoreData.com
MatthewMorey.com | @xzolian
BuoyExplorer.com
Agenda
Managed Object
Context
Managed
Object
Managed
Object
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Main Queue
Memory
Speed
Less More
Slow Faster
Memory
Speed
Less More
Slow Faster
Memory
Speed
Less More
Slow Faster
Tools
#define TICK NSDate *startTime = [NSDate date]
#define TOCK NSLog(@"Elapsed Time: %f",
-[startTime timeIntervalSinceNow])
#define TICK NSDate *startTime = [NSDate date]
#define TOCK NSLog(@"Elapsed Time: %f",
-[startTime timeIntervalSinceNow])
...
TICK;
[self methodYouWantToMeasure];
TOCK;
-com.apple.CoreData.SQLDebug [1,2,3]
-com.apple.CoreData.SQLDebug [1,2,3]
-com.apple.CoreData.SQLDebug [1,2,3]
-com.apple.CoreData.SQLDebug [1,2,3]
-com.apple.CoreData.SQLDebug [1,2,3]
-com.apple.CoreData.SyntaxColoredLogging 1
-com.apple.CoreData.MigrationDebug 1
-com.apple.CoreData.SQLiteDebugSynchronous [0,1,2]
-com.apple.CoreData.SQLiteIntegrityCheck [1]
-com.apple.CoreData.ThreadingDebug [1,2,3]
$ sqlite3
$ sqlite3 UFO.sqlite
sqlite> select * from sqlite_master;
table|ZUFOSIGHTING|ZUFOSIGHTING|3|CREATE TABLE
ZUFOSIGHTING ( Z_PK...VARCHAR )
table|Z_PRIMARYKEY|Z_PRIMARYKEY|4|CREATE TABLE
Z_PRIMARYKEY (Z_ENT...INTEGER)
table|Z_METADATA|Z_METADATA|5|CREATE TABLE
Z_METADATA (Z_VERSION...BLOB)
sqlite> SELECT t0.ZSHAPE, COUNT( t0.ZSHAPE )
FROM ZUFOSIGHTING t0 GROUP BY t0.ZSHAPE;
changed|1
changing|1546
chevron|760
cigar|1782
circle|5271
cone|265
...
teardrop|595
triangle|6082
unknown|4490
Pony Debugger
SQLite
Professional
Tools
•Macros
•Launch Arguments
•SQL
•Instruments
•Measure, Measure, Measure
Fetching
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"UFOSighting"];
[fetchRequest setFetchBatchSize:20];
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"UFOSighting"];
NSArray *UFOSightingsArray =
[self.managedObjectContext executeFetchRequest:fetchRequest
error:NULL];
NSMutableDictionary *uniqueShapesDictionary =
[NSMutableDictionary dictionary];
for (UFOSighting *sighting in UFOSightingsArray) {
...
// Count unique shape items
...
}
NSManagedObject
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"UFOSighting"];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:@"shape"];
NSDictionaryResultType
NSFetchRequest *fetchRequest =
[NSFetchRequest fetchRequestWithEntityName:@"UFOSighting"];
NSExpressionDescription *expressionDescription =
[[NSExpressionDescription alloc] init];
[expressionDescription setName:@"count"];
[expressionDescription setExpression:
[NSExpression expressionForFunction:@"count:" arguments:
@[[NSExpression expressionForKeyPath:@"shape"]]]];
[fetchRequest setPropertiesToFetch:@[@"shape", expressionDescription]];
[fetchRequest setPropertiesToGroupBy:@[@"shape"]];
[fetchRequest setResultType:NSDictionaryResultType];
NSExpression
Prefetch Required Relationships
[fetchRequest
setRelationshipKeyPathsForPrefetching:
@[@"photo"]];
Fetching
•Don’t fetch more than you need
•Set a batch size
•Let SQLite do the calculations
•Prefetch required relationships
Predicates
Light Comparisons First
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:
@"shape == %@ AND duration > %i", @"sphere", 30]];
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:
@"shape == %@ AND duration > %i", @"sphere", 30]];
[fetchRequest setPredicate:
[NSPredicate predicateWithFormat:
@"duration > %i AND shape == %@", 30, @"sphere"]];
Be Cautions with Strings
Predicate
Costs
Less More
Beginswith
Endswith
Equality
==
Contains
Matches
Predicate
Costs
Less More
Beginswith
Endswith
Equality
==
Contains
Matches
[cd] cost you even more
Predicates
•Do light (numerical) comparisons first
•Beginswith/Endswith instead of Contains/Matches
•Don’t use [cd]
Searching
Canonicalize String Properties
Canonicalize String Properties
Description canonicalizedDesc
Green Mën green men
BEAM beam
Prόbë probe
ABDUCTION abduction
- (void)setDesc:(NSString *)desc {
if (_desc != desc) {
_desc = desc;
[self updateCanonicalizedDesc:desc];
}
}
- (void)updateCanonicalizedDesc:(NSString *)desc {
NSMutableString *result = [NSMutableString stringWithString:desc];
CFStringNormalize((CFMutableStringRef)result,
kCFStringNormalizationFormD);
CFStringFold((CFMutableStringRef)result,
kCFCompareCaseInsensitive |
kCFCompareDiacriticInsensitive |
kCFCompareWidthInsensitive, NULL);
self.canonicalizedDesc = [NSString stringWithString:result];
}
- (void)setDesc:(NSString *)desc {
if (_desc != desc) {
_desc = desc;
[self updateCanonicalizedDesc:desc];
}
}
- (void)updateCanonicalizedDesc:(NSString *)desc {
NSMutableString *result = [NSMutableString stringWithString:desc];
CFStringNormalize((CFMutableStringRef)result,
kCFStringNormalizationFormD);
CFStringFold((CFMutableStringRef)result,
kCFCompareCaseInsensitive |
kCFCompareDiacriticInsensitive |
kCFCompareWidthInsensitive, NULL);
self.canonicalizedDesc = [NSString stringWithString:result];
}
Canonicalized Tokens
componentsSeperatedByCharactersInSet
Separate Stack
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Primary
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Search Tokens
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Primary
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Search Tokens
URIRepresentation
Hash of Tokens
Searching
•Canonicalize text properties
•Use tokens
•Separate persistence stack
•Hash of tokens
Data Model
Don’t Overnormalize
•Duplication isn’t always bad
•Let UI drive data model
Use External Storage
Data Model
•Don’t overnormalize
•Use external storage for large attributes
•Large blobs as separate entity
•Less data takes less time to fetch
App Launch
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
// Create persistent store coordinator with model
// Add persistent store to store coordinator
// Create managed object context
// Context is fully initialized, notify view controllers
dispatch_sync(dispatch_get_main_queue(), ^{
[self persistentStackInitialized];
});
});
“Lots of Things” Problem
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier backgroundTask = 0;
backgroundTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
}];
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Delete or update a bunch of NSManagedObjects
// If success
[app endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
// If failure
[app endBackgroundTask:backgroundTask];
backgroundTask = UIBackgroundTaskInvalid;
});
}
Importing Data
Main Queue vs Private Queue
self.managedObjectContext = self.persistenceStack.managedObjectContext;
self.managedObjectContext.undoManager = nil;
[self.managedObjectContext performBlockAndWait:^{
[self import];
}];
Main Queue vs Private Queue
self.managedObjectContext = self.persistenceStack.managedObjectContext;
self.managedObjectContext.undoManager = nil;
[self.managedObjectContext performBlockAndWait:^{
[self import];
}];
NSManagedObjectContext *privateManagedObjectContext =
[[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[privateManagedObjectContext setPersistentStoreCoordinator:
self.managedObjectContext.persistentStoreCoordinator];
privateManagedObjectContext.undoManager = nil;
[privateManagedObjectContext performBlockAndWait:^{
[self import];
}];
Typical Import Algorithm
1) JSON to NSDictionary
2) Find existing NSManagedObject
3) Optionally, create new NSManagedObject
4) Set attributes of new/updated NSManagedObject
Typical Import Algorithm
1) JSON to NSDictionary
2) Find existing NSManagedObject
3) Optionally, create new NSManagedObject
4) Set attributes of new/updated NSManagedObject
Inefficient Find-Or-Create Algorithm
+ (instancetype)findOrCreateWithIdentifier:(id)identifier
inContext:(NSManagedObjectContext *)context {
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:@"UFOSighting”];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"%K = %@",
@"GUID”, identifier];
fetchRequest.fetchLimit = 1;
id object = [[context executeFetchRequest:fetchRequest error:NULL]
lastObject];
if (object == nil) {
object = [UFOSighting insertNewObjectIntoContext:context];
}
return object;
}
Inefficient Find-Or-Create Algorithm
+ (instancetype)findOrCreateWithIdentifier:(id)identifier
inContext:(NSManagedObjectContext *)context {
NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:@"UFOSighting”];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"%K = %@",
@"GUID”, identifier];
fetchRequest.fetchLimit = 1;
id object = [[context executeFetchRequest:fetchRequest error:NULL]
lastObject];
if (object == nil) {
object = [UFOSighting insertNewObjectIntoContext:context];
}
return object;
}
1
2
3
4
...
New Data
1
4
...
Old Data
1
2
3
4
...
New Data
1
4
...
Old Data
Update
1
2
3
4
...
New Data
1
4
...
Old Data
Insert
1
2
3
4
...
New Data
1
4
...
Old Data
2
1
2
3
4
...
New Data
1
4
...
Old Data
2
1
2
3
4
...
New Data
1
4
...
Old Data
2
Insert
1
2
3
4
...
New Data
1
4
...
Old Data
2
3
1
2
3
4
...
New Data
1
4
...
Old Data
2
3
Update
Inefficient Find-Or-Create Algorithm
NSEnumerator *jsonEnumerator = [sortedArray objectEnumerator];
NSEnumerator *fetchResultsEnumerator = [fetchResults objectEnumerator];
NSDictionary *UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSighting *UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
while (UFOSightingDictionary) {
// Check if managed object already exist
// Not an update, create new managed object
// Set new attributes
if (isUpdate) {
UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
} else {
UFOSightingDictionary = [jsonEnumerator nextObject];
}
}
Inefficient Find-Or-Create Algorithm
NSEnumerator *jsonEnumerator = [sortedArray objectEnumerator];
NSEnumerator *fetchResultsEnumerator = [fetchResults objectEnumerator];
NSDictionary *UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSighting *UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
while (UFOSightingDictionary) {
// Check if managed object already exist
// Not an update, create new managed object
// Set new attributes
if (isUpdate) {
UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
} else {
UFOSightingDictionary = [jsonEnumerator nextObject];
}
}
Inefficient Find-Or-Create Algorithm
NSEnumerator *jsonEnumerator = [sortedArray objectEnumerator];
NSEnumerator *fetchResultsEnumerator = [fetchResults objectEnumerator];
NSDictionary *UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSighting *UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
while (UFOSightingDictionary) {
// Check if managed object already exist
// Not an update, create new managed object
// Set new attributes
if (isUpdate) {
UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
} else {
UFOSightingDictionary = [jsonEnumerator nextObject];
}
}
Inefficient Find-Or-Create Algorithm
NSEnumerator *jsonEnumerator = [sortedArray objectEnumerator];
NSEnumerator *fetchResultsEnumerator = [fetchResults objectEnumerator];
NSDictionary *UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSighting *UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
while (UFOSightingDictionary) {
// Check if managed object already exist
// Not an update, create new managed object
// Set new attributes
if (isUpdate) {
UFOSightingDictionary = [jsonEnumerator nextObject];
UFOSightingManagedObject = [fetchResultsEnumerator nextObject];
} else {
UFOSightingDictionary = [jsonEnumerator nextObject];
}
}
NSUInteger totalUFOSightings = [UFOSightingsArray count];
NSInteger totalBatches = totalUFOSightings / MDM_BATCH_SIZE_IMPORT;
// Create array with just the unique keys
NSArray *jsonGUIDArray = [sortedArray valueForKey:UFO_KEY_JSON_GUID];
for (NSInteger batchCounter = 0; batchCounter <= totalBatches; batchCounter++) {
// Create batch range based on batch size
NSRange range = NSMakeRange(batchCounter*MDM_BATCH_SIZE_IMPORT,MDM_BATCH_SIZE_IMPORT);
NSArray *jsonBatchGUIDArray = [jsonGUIDArray subarrayWithRange:range];
// Grab sorted persisted managed objects, based on the batch
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"UFOSighting"];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"%K IN %@",
@"GUID", jsonBatchGUIDArray];
// ...
while (UFOSightingDictionary) {
// ...
// Efficient find-or-create algorithm
// ...
}
}
NSUInteger totalUFOSightings = [UFOSightingsArray count];
NSInteger totalBatches = totalUFOSightings / MDM_BATCH_SIZE_IMPORT;
// Create array with just the unique keys
NSArray *jsonGUIDArray = [sortedArray valueForKey:UFO_KEY_JSON_GUID];
for (NSInteger batchCounter = 0; batchCounter <= totalBatches; batchCounter++) {
// Create batch range based on batch size
NSRange range = NSMakeRange(batchCounter*MDM_BATCH_SIZE_IMPORT,MDM_BATCH_SIZE_IMPORT);
NSArray *jsonBatchGUIDArray = [jsonGUIDArray subarrayWithRange:range];
// Grab sorted persisted managed objects, based on the batch
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"UFOSighting"];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"%K IN %@",
@"GUID", jsonBatchGUIDArray];
// ...
while (UFOSightingDictionary) {
// ...
// Efficient find-or-create algorithm
// ...
}
}
NSUInteger totalUFOSightings = [UFOSightingsArray count];
NSInteger totalBatches = totalUFOSightings / MDM_BATCH_SIZE_IMPORT;
// Create array with just the unique keys
NSArray *jsonGUIDArray = [sortedArray valueForKey:UFO_KEY_JSON_GUID];
for (NSInteger batchCounter = 0; batchCounter <= totalBatches; batchCounter++) {
// Create batch range based on batch size
NSRange range = NSMakeRange(batchCounter*MDM_BATCH_SIZE_IMPORT,MDM_BATCH_SIZE_IMPORT);
NSArray *jsonBatchGUIDArray = [jsonGUIDArray subarrayWithRange:range];
// Grab sorted persisted managed objects, based on the batch
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]initWithEntityName:@"UFOSighting"];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"%K IN %@",
@"GUID", jsonBatchGUIDArray];
// ...
while (UFOSightingDictionary) {
// ...
// Efficient find-or-create algorithm
// ...
}
}
Pre-Populated SQLite
File in App Bundle
Download Pre-Populated
SQLite File
Importing Data
•Do import work on private queues
•Use efficient find-or-create algorithm
•Work in batches to keep memory low
•Use pre-populated SQLite file
Memory
[context refreshObject:UFOSightingManagedObject mergeChanges:NO];
[context reset];
Concurrency
Models
Managed Object
Context
Managed
Object
Managed
Object
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Main Queue
Managed Object
Context
Managed
Object
Managed
Object
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Main Queue
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Context Did Save
Notification
Merge Changes
From Notification
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Context Did Save
Notification
Refetch and
Reload
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Managed Object
Context
Private Queue
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Managed Object
Context
Private Queue
UI Work
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Managed Object
Context
Private Queue
UI Work
Persisting to
Disk
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Managed Object
Context
Private Queue
UI Work
Persisting to
Disk
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Managed Object
Context
Private Queue
UI Work
Persisting to
Disk
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Background
Updates
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Background
Updates
UI Work
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Background
Updates
UI Work
Persisting to
Disk
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Background
Updates
UI Work
Persisting to
Disk
Persistent Store
Coordinator
Persistent Store
Model
Main Queue
Managed Object
Context
Private Queue
Managed Object
Context
Managed Object
Context
Private Queue
Background
Updates
UI Work
Persisting to
Disk
__block NSManagedObjectContext *temporaryContext = self.workerObjectContext;
__block NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
__block NSManagedObjectContext *writerObjectContext = self.writerManagedObjectContext;
[temporaryContext performBlock:^{
NSError *error = nil;
if (![temporaryContext save:&error]) {
// TODO: Handle error
}
[managedObjectContext performBlock:^{
NSError *error = nil;
if (![managedObjectContext save:&error]) {
// TODO: Handle error
}
[writerObjectContext performBlock:^{
NSError *error = nil;
if (![writerObjectContext save:&error]) {
// TODO: Handle error
}
// Success!!!
}]; // writerObjectContext
}]; // managedObjectContext
}]; // temporaryContext
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Context Did Save
Notification
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Context Did Save
Notification
Merge Changes
From Notification
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Context Did Save
Notification
Refetch and
Reload
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Persistent Store
Coordinator
Model
Context Did Save
Notification
Refetch and
Reload
•Cannot pass objects between persistent store
coordinators
•Cannot pass objectIDs between persistent store
coordinators
•You can use URIRepresentation
•You can use
mergeChangesFromContextDidSaveNotification
TLDR
Managed Object
Context
Persistent Store
Coordinator
Persistent Store
(SQLite, XML, ...)
Model
Managed Object
Context
Main Queue Private Queue
Context Did Save
Notification
Refetch and
Reload
Concurrency Models
•Use the simplest model that meets your needs
•Update main context after large imports have completed
Bang
Head
Here
In general...
•Use the tools, and measure, measure, measure
•Don’t load more than you need to
•Don’t use [cd]
•Be smart with your data model
•Import on a private queue in batches
•Pick the correct (but simplest) concurrency model
Questions?
HighPerformanceCoreData.com
MatthewMorey.com | @xzolian

Weitere ähnliche Inhalte

Was ist angesagt?

MongoDB: tips, trick and hacks
MongoDB: tips, trick and hacksMongoDB: tips, trick and hacks
MongoDB: tips, trick and hacks
Scott Hernandez
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative version
WO Community
 

Was ist angesagt? (20)

Simpler Core Data with RubyMotion
Simpler Core Data with RubyMotionSimpler Core Data with RubyMotion
Simpler Core Data with RubyMotion
 
Taking a Test Drive
Taking a Test DriveTaking a Test Drive
Taking a Test Drive
 
Modern Android app library stack
Modern Android app library stackModern Android app library stack
Modern Android app library stack
 
MongoDB: tips, trick and hacks
MongoDB: tips, trick and hacksMongoDB: tips, trick and hacks
MongoDB: tips, trick and hacks
 
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
[Srijan Wednesday Webinars] Ruling Drupal 8 with #d8rules
 
Angular JS deep dive
Angular JS deep diveAngular JS deep dive
Angular JS deep dive
 
【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例
 
Lazy evaluation drupal camp moscow 2014
Lazy evaluation drupal camp moscow 2014Lazy evaluation drupal camp moscow 2014
Lazy evaluation drupal camp moscow 2014
 
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
【Unite 2017 Tokyo】ScriptableObjectを使ってプログラマーもアーティストも幸せになろう
 
Polyglot persistence with Spring Data
Polyglot persistence with Spring DataPolyglot persistence with Spring Data
Polyglot persistence with Spring Data
 
Zend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching loggingZend framework 03 - singleton factory data mapper caching logging
Zend framework 03 - singleton factory data mapper caching logging
 
Whats new in iOS5
Whats new in iOS5Whats new in iOS5
Whats new in iOS5
 
Indexed db
Indexed dbIndexed db
Indexed db
 
NoSQL and JavaScript: a love story
NoSQL and JavaScript: a love storyNoSQL and JavaScript: a love story
NoSQL and JavaScript: a love story
 
Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
iOS for ERREST - alternative version
iOS for ERREST - alternative versioniOS for ERREST - alternative version
iOS for ERREST - alternative version
 
C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴C#을 이용한 task 병렬화와 비동기 패턴
C#을 이용한 task 병렬화와 비동기 패턴
 
Bulk Loading Data into Cassandra
Bulk Loading Data into CassandraBulk Loading Data into Cassandra
Bulk Loading Data into Cassandra
 
SenchaCon 2016: The Once and Future Grid - Nige White
SenchaCon 2016: The Once and Future Grid - Nige WhiteSenchaCon 2016: The Once and Future Grid - Nige White
SenchaCon 2016: The Once and Future Grid - Nige White
 
Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...Singletons in PHP - Why they are bad and how you can eliminate them from your...
Singletons in PHP - Why they are bad and how you can eliminate them from your...
 

Ähnlich wie High Performance Core Data

Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
Whymca
 

Ähnlich wie High Performance Core Data (20)

Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCABeginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
 
Google App Engine Developer - Day3
Google App Engine Developer - Day3Google App Engine Developer - Day3
Google App Engine Developer - Day3
 
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
 
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
 
solving little problems
solving little problemssolving little problems
solving little problems
 
Moar tools for asynchrony!
Moar tools for asynchrony!Moar tools for asynchrony!
Moar tools for asynchrony!
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Mongo+java (1)
Mongo+java (1)Mongo+java (1)
Mongo+java (1)
 
Taking Objective-C to the next level. UA Mobile 2016.
Taking Objective-C to the next level. UA Mobile 2016.Taking Objective-C to the next level. UA Mobile 2016.
Taking Objective-C to the next level. UA Mobile 2016.
 
iOS Session-2
iOS Session-2iOS Session-2
iOS Session-2
 
Hadoop Integration in Cassandra
Hadoop Integration in CassandraHadoop Integration in Cassandra
Hadoop Integration in Cassandra
 
Talk KVO with rac by Philippe Converset
Talk KVO with rac by Philippe ConversetTalk KVO with rac by Philippe Converset
Talk KVO with rac by Philippe Converset
 
Thunderstruck
ThunderstruckThunderstruck
Thunderstruck
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Agile Iphone Development
Agile Iphone DevelopmentAgile Iphone Development
Agile Iphone Development
 
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプCocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
Cocoa勉強会23-識別情報の変換〜文字エンコードとデータタイプ
 
iPhone and Rails integration
iPhone and Rails integrationiPhone and Rails integration
iPhone and Rails integration
 
Day 1
Day 1Day 1
Day 1
 
Practical Google App Engine Applications In Py
Practical Google App Engine Applications In PyPractical Google App Engine Applications In Py
Practical Google App Engine Applications In Py
 
Day 2
Day 2Day 2
Day 2
 

Kürzlich hochgeladen

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 

High Performance Core Data