Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iAsync Functional Programming in Objective-C

iAsync Functional Programming in Objective-C

Oleksandr Dodatko

October 30, 2013
Tweet

More Decks by Oleksandr Dodatko

Other Decks in Programming

Transcript

  1. NSURL *url = [NSURL URLWithString:@"https://...."]; NSURLRequest *request = [NSURLRequest requestWithURL:url];

    id onSuccess = ^(NSURLRequest *, NSHTTPURLResponse *, id JSON) { NSLog( @"App.net Global Stream: %@", JSON ); }; AFJSONRequestOperation *operation = [ AFJSONRequestOperation JSONRequestOperationWithRequest: request success: onSuccess failure: nil ]; [ operation start ];
  2. When using methods which return blocks they can be very

    convenient. However, when you have to string a few of them together it gets messy really quickly
  3. It was not uncommon when using AFNetworking in Gowalla to

    have calls chained together in success blocks. My advice would be to factor the network requests and serializations as best you can into class methods in your model. Then, for requests that need to make sub-requets, you can call those methods in the success block.
  4. Working with independent data sets in parallel and then combining

    them into a final result is non-trivial in Cocoa, and often involves a lot of synchronization
  5. __block NSArray *databaseObjects, fileContents; NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init];

    NSBlockOperation *databaseOperation = [NSBlockOperation blockOperationWithBlock:^{ databaseObjects = [databaseClient fetchObjectsMatchingPredicate:predicate]; }]; NSBlockOperation *filesOperation = [NSBlockOperation blockOperationWithBlock:^{ NSMutableArray *filesInProgress = [NSMutableArray array]; for (NSString *path in files) { [filesInProgress addObject:[NSData dataWithContentsOfFile:path]]; } fileContents = [filesInProgress copy]; }]; NSBlockOperation *finishOperation = [NSBlockOperation blockOperationWithBlock:^{ [self finishProcessingDatabaseObjects:databaseObjects fileContents:fileContents]; NSLog(@"Done processing"); }]; [finishOperation addDependency:databaseOperation]; [finishOperation addDependency:filesOperation]; [backgroundQueue addOperation:databaseOperation]; [backgroundQueue addOperation:filesOperation]; [backgroundQueue addOperation:finishOperation];
  6. Rather than using mutable variables which are replaced and modified

    in-place, RAC provides signals (represented by RACSignal) that capture present and future values.
  7. loadFromNet = sequenceOfAsyncOperations( @[ login, loadFromNet ] ); loadRawData =

    trySequenceOfAsyncOperations( @[ loadFromFSCache, loadFromNet ] ); JFFAsyncOperation getData = bindSequenceOfAsyncOperations( loadRawData, @[ parseBinder, filterBinder ] );