Importing & Exporting Efficiently Marcus S. Zarra
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Wednesday, September 29, 2010
Blocking UIs are evil
Don’t Be Evil Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
Wednesday, September 29, 2010
Update in the background
How? Wednesday, September 29, 2010
Use Core Data
Wednesday, September 29, 2010
Use Core Data Duh! http://pragprog.com/titles/mzcd/core-data Wednesday, September 29, 2010
Incoming Data Formats
Wednesday, September 29, 2010
Incoming Data Formats Don’t make the mobile device work
Wednesday, September 29, 2010
Incoming Data Formats Don’t make the mobile device work Let the ser ver format it in the easiest way
Wednesday, September 29, 2010
Incoming Data Formats Don’t make the mobile device work Let the ser ver format it in the easiest way JSON is currently the easiest to get into Core Data
Wednesday, September 29, 2010
Incoming Data Formats Don’t make the mobile device work Let the ser ver format it in the easiest way JSON is currently the easiest to get into Core Data YAJL will do stream parsing!
Wednesday, September 29, 2010
Incoming Data Formats Don’t make the mobile device work Let the ser ver format it in the easiest way JSON is currently the easiest to get into Core Data YAJL will do stream parsing! GZip the stream! Wednesday, September 29, 2010
Wednesday, September 29, 2010
Background
Wednesday, September 29, 2010
Background Foreground
Wednesday, September 29, 2010
NSURLConnection
Background Foreground
Wednesday, September 29, 2010
NSURLConnection NSOperation (or blocks)
Background Foreground
Wednesday, September 29, 2010
NSURLConnection NSOperation (or blocks) -[NSManagedObjectContext save:] Background Foreground
Wednesday, September 29, 2010
NSURLConnection NSOperation (or blocks) -[NSManagedObjectContext save:] Background Foreground
Update the User Interface Wednesday, September 29, 2010
Im
t r po
What is the UI doing?
Wednesday, September 29, 2010
Im
t r po
What is the UI doing? It is displaying cached data
Wednesday, September 29, 2010
Im
t r po
What is the UI doing? It is displaying cached data The user is accessing that cached data
Wednesday, September 29, 2010
Wednesday, September 29, 2010
Foreground
Wednesday, September 29, 2010
Background Foreground
Wednesday, September 29, 2010
Background Foreground
Export
Wednesday, September 29, 2010
NSOperation (or blocks) Background Foreground
Export
Wednesday, September 29, 2010
NSURLConnection
NSOperation (or blocks) Background Foreground
Export
Wednesday, September 29, 2010
-[NSManagedObjectContext save:] NSURLConnection
NSOperation (or blocks) Background Foreground
Export
Wednesday, September 29, 2010
-[NSManagedObjectContext save:] NSURLConnection
NSOperation (or blocks) Background Foreground
Export
Wednesday, September 29, 2010
Update UI
Ex
t r po
What is the UI doing?
Wednesday, September 29, 2010
Ex
t r po
What is the UI doing? The user is oblivious to the export
Wednesday, September 29, 2010
Ex
t r po
What is the UI doing? The user is oblivious to the export If the user must know, give them a UI clue when it is done.
Wednesday, September 29, 2010
Core Data vs. Threading
Wednesday, September 29, 2010
Core Data vs. Threading One Context per Thread
Wednesday, September 29, 2010
Core Data vs. Threading One Context per Thread ManagedObjects stay in their owning thread
Wednesday, September 29, 2010
Core Data vs. Threading One Context per Thread ManagedObjects stay in their owning thread ObjectIDs can cross threads
Wednesday, September 29, 2010
Core Data vs. Threading One Context per Thread ManagedObjects stay in their owning thread ObjectIDs can cross threads Notifications stay in their own thread
Wednesday, September 29, 2010
Go onto the main thread - (void)contextUpdated:(NSNotification*)notification { if ([notification object] == [self mainMOC]) return; if (![NSThread isMainThread]) { [self performSelectorOnMainThread:@selector(contextUpdated:) withObject:notification waitUntilDone:YES]; return; } [[self mainMOC] mergeChangesFromContextDidSaveNotification:notification]; if (![[self mainMOC] hasChanges]) return;
}
NSError *error = nil; ZAssert([[self mainMOC] save:&error], @"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
Wednesday, September 29, 2010
Building An NSOperation
Wednesday, September 29, 2010
@interface ZSImportOperation : NSOperation { NSPersistentStoreCoordinator *persistentStoreCoordinator; NSInteger entriesToCreate; NSInteger saveFrequency; NSTimeInterval runSpeed; }
- (void)main { ZAssert([self persistentStoreCoordinator], @"PSC is nil"); NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSRunLoopCommonModes]; NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; [moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
Wednesday, September 29, 2010
@interface ZSImportOperation : NSOperation { NSPersistentStoreCoordinator *persistentStoreCoordinator; NSInteger entriesToCreate; NSInteger saveFrequency; NSTimeInterval runSpeed; }
- (void)main { ZAssert([self persistentStoreCoordinator], @"PSC is nil"); NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSRunLoopCommonModes]; NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; [moc setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
Wednesday, September 29, 2010
NSError *error = nil; for (id dataElement in jsonImportArray) { //Do the actual import if (index % [self saveFrequency] != 0) continue; ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]);
}
DLog(@"saving background context"); [moc reset]; [pool drain], pool = nil;
Wednesday, September 29, 2010
NSError *error = nil; for (id dataElement in jsonImportArray) { //Do the actual import if (index % [self saveFrequency] != 0) continue; ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]);
}
DLog(@"saving background context"); [moc reset]; [pool drain], pool = nil;
Wednesday, September 29, 2010
NSError *error = nil; for (id dataElement in jsonImportArray) { //Do the actual import if (index % [self saveFrequency] != 0) continue; ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]);
}
DLog(@"saving background context"); [moc reset]; [pool drain], pool = nil;
Wednesday, September 29, 2010
NSError *error = nil; for (id dataElement in jsonImportArray) { //Do the actual import if (index % [self saveFrequency] != 0) continue; ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]);
}
DLog(@"saving background context"); [moc reset]; [pool drain], pool = nil;
Wednesday, September 29, 2010
ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]); [moc release], moc = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kImportRoutineComplete object:self]; }
[pool drain], pool = nil;
Wednesday, September 29, 2010
ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]); [moc release], moc = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kImportRoutineComplete object:self]; }
[pool drain], pool = nil;
Wednesday, September 29, 2010
ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]); [moc release], moc = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kImportRoutineComplete object:self]; }
[pool drain], pool = nil;
Wednesday, September 29, 2010
ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]); [moc release], moc = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kImportRoutineComplete object:self]; }
[pool drain], pool = nil;
Wednesday, September 29, 2010
ZAssert([moc save:&error], @"Error saving context on operation: %@\n%@", [error localizedDescription], [error userInfo]); [moc release], moc = nil; [[NSNotificationCenter defaultCenter] postNotificationName:kImportRoutineComplete object:self]; }
[pool drain], pool = nil;
Wednesday, September 29, 2010
Not Using Core Data?
Wednesday, September 29, 2010
Summary
Wednesday, September 29, 2010
Summary Use Core Data
Wednesday, September 29, 2010
Summary Use Core Data Use asynchronous connections to ser vers
Wednesday, September 29, 2010
Summary Use Core Data Use asynchronous connections to ser vers Use background operations (or blocks)
Wednesday, September 29, 2010
Summary Use Core Data Use asynchronous connections to ser vers Use background operations (or blocks) Use the main thread only for User Interaction
Wednesday, September 29, 2010
Summary Use Core Data Use asynchronous connections to ser vers Use background operations (or blocks) Use the main thread only for User Interaction Consider the main thread UI only
Wednesday, September 29, 2010
Marcus S. Zarra
Wednesday, September 29, 2010
cimgf.com
@mzarra
Marcus S. Zarra
[email protected] Wednesday, September 29, 2010