Marcus S. Zarra

Report 1 Downloads 60 Views
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