Video: https://vimeo.com/71689429
Announcing AFNetworking 2.0 to the New York iOS Developer Meetup on August 1, 2013, and CocoaConf PDX on August 16, 2013.
2
View Slide
@mattt @sco
State of theLibrary
• 8,800+ Stars• 2,200+ Forks• 1,500+ Commits• 1,300+ Closed Issues• 130 Contributors
Continuous IntegrationAutomated Documentation
Official Extensions• OAuth 1.0a• OAuth 2.0• Amazon S3• JSON-RPC• Collection+JSON• Logger
Official Extensions
Official Extensionshttp://mneorr.github.io/Alcatraz/Download Xcode Template with Alcatraz
Third-PartyExtensions• XAuth• CSV• iCalendar• HAR (HTTP Archive)• RSS• Gravatar• WebDav
Built onAFNetworkingRestKit NimbusKit OctoKit
10,000'sBuilt onAFNetworkingApps Built Using AFNetworking
These are confidential sessions—please refrain from streaming, blogging, or taking picturesSession 705What’s New in Foundation Networking
NSURLSession
NSURLSession• Session Configuration• URL Cache• Protocols• Cookie Storage• Tasks• Backgroundable• Data, Upload, & Download
AFNetworking 2.0
AFNetworking 2.0• iOS 6+ & Mac OS X 10.8+• Xcode 5• NSURLSession & NSURLConnection• Serialization Modules• UIKit Extensions• Real-time
Requirements
Serializers
AFURLConnectionOperationAFHTTPRequestOperationAFJSONRequestOperation
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))successfailure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{#pragma clang diagnostic push#pragma clang diagnostic ignored "-Warc-retain-cycles"#pragma clang diagnostic ignored "-Wgnu"self.completionBlock = ^ {if (self.error) {if (failure) {dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{failure(self, self.error);});}} else {dispatch_async(json_request_operation_processing_queue(), ^{id JSON = self.responseJSON;if (self.error) {if (failure) {dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{failure(self, self.error);});}} else {if (success) {dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{success(self, JSON);});}}});}};#pragma clang diagnostic pop}
- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))successfailure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure{__weak __typeof(self)weakSelf = self;[super setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {__strong __typeof(weakSelf)strongSelf = weakSelf;if (![responseObject isKindOfClass:[NSData class]]) {[strongSelf setResponseJSON:responseObject];}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {__strong __typeof(weakSelf)strongSelf = weakSelf;[strongSelf setError:error];}];}
op.responseSerializer = [AFJSONSerializer serializer];
- requestBySerializingRequest:withParameters:error:- responseObjectForResponse:data:error:
• Shared Between Request Operations & Session Tasks• Significantly Reduced Boilerplate Code• Pluggable & Configurable• Protocol, Not SubclassSerializers
Built-in Serializers• HTTP• JSON• Property List• HTTP• JSON• XML Parser• XML Document (OSX)• Property List• ImageRequest Response
Serializer Extensions• MsgPack• CSV / TSV• vCard• vCal• WebP
Object Serialization• NSObject• NSManagedObject• RKManagedObject• MTLModel
Changes toAFHTTPRequestOperation• You'll Actually Use it Directly!• @property responseSerializer• @property completionQueue• @property completionGroup
NSURL *URL = [NSURL URLWithString:@"http://example.com/foo.json"];NSURLRequest *request = [NSURLRequest requestWithURL:URL];AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];operation.responseSerializer = [AFJSONSerializer serializer];[operation start];
AFURLConnectionOperationAFHTTPRequestOperation
Content OperationExtension• AFJSONRequestOperation• AFXMLRequestOperation• AFPropertyListRequestOperation• AFImageRequestOperation
AFURLSessionManager
NSURLSession 2 Methods 5 Methods 4 Methods 3 Methods
NSURLSession14Delegate Methods
AFURLSessionManager• Provides Block-based Callbacks for Delegate Methods• Including Default Expected Implementation• Provides Per-Task Upload / Download Progress Callbacks• Convenience Methods for Session Management
AFHTTPClientthe
AFHTTPClient• Create Requests• Parameter Query String Serialization• Multipart Form Stream Creation• Default Headers• Create and Manage Request Operations• Create Batched Operations• Monitor Network Reachability
New Architecture• • • AFSecurityPolicy• AFNetworkReachabilityManager
New ArchitectureNSURLConnection NSURLSessionAFHTTPRequestOperationAFURLConnectionOperationData Upload DownloadNSURLSessionTaskNSURLSessionTaskNSURLSessionTaskAFHTTPClient AFHTTPSessionManagerAFURLSessionManager
AFHTTPSessionManager• Expanded & Refactored HTTP Convenience Methods• Almost identical between Session & Request Operation Managers• Default to JSON Response Serializer• No Longer Requires baseURL
- (Object *)GET:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *, id))successfailure:(void (^)(Object *, NSError *))failure;- (Object *)HEAD:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *))successfailure:(void (^)(Object *, NSError *))failure;
- (Object *)POST:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *, id))successfailure:(void (^)(Object *, NSError *))failure;- (Object *)POST:(NSString *)URLStringparameters:(NSDictionary *)parametersconstructingBodyWithBlock:(void (^)(id ))blocksuccess:(void (^)(Object *, id))successfailure:(void (^)(Object *, NSError *))failure;
- (Object *)PUT:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *, id))successfailure:(void (^)(Object *, NSError *))failure;- (Object *)PATCH:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *, id))successfailure:(void (^)(Object *, NSError *))failure;- (Object *)DELETE:(NSString *)URLStringparameters:(NSDictionary *)parameterssuccess:(void (^)(Object *))successfailure:(void (^)(Object *, NSError *))failure;
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)requestcompletionHandler:(void (^)(NSHTTPURLResponse *,id,NSError *error))completionHandler;
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)requestfromFile:(NSURL *)fileURLprogress:(NSProgress **)progresscompletionHandler:(void (^)(NSHTTPURLResponse *,id,NSError *error))completionHandler;- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)requestfromData:(NSData *)bodyDataprogress:(NSProgress **)progresscompletionHandler:(void (^)(NSHTTPURLResponse *,id,NSError *error))completionHandler;
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)requestprogress:(NSProgress **)progresscompletionHandler:(void (^)(NSHTTPURLResponse *,NSURL *,NSError *error))completionHandler;- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeDataprogress:(NSProgress **)progresscompletionHandler:(void (^)(NSHTTPURLResponse *,NSURL *,NSError *error))completionHandler;
AFSecurityPolicy• Evaluate Server Trust• Pinned Certificates• Pinned Public Keys• Validate Server Certs
AFNetworkReachabilityManager• Monitor NetworkReachability• Domain• IP Address• Determine Type ofConnection
UIKit Extensions
UIKit Extensions• Network Activity Indicator• UIImageView• UIButton• UIActivityIndicatorView• UIProgressView• UIWebView
Real-time
R O C K E Ta hybrid approach to real-time cloud applications
Server-Sent EventsW3C Event Source Draft SpecJSON PatchRFC 6902
Document StreamRequestResponseGET /resourcesAccept: application/jsonSUBSCRIBE /resourcesAccept: text/event-streamHTTP/1.1 200 OKContent-Type: application/json{"resources": [...]}HTTP/1.1 200 OKContent-Type: text/event-streamevent: patchdata: [{"op": "add","path": "/resources/123","value": {...}}]
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];[manager SUBSCRIBE:@"http://example.com/resources"usingBlock:^(NSArray *operations, NSError *error){for (AFJSONPatchOperation *operation in operations) {switch (operation.type) {case AFJSONAddOperationType:[self.resources addObject:operation.value];break;case AFJSONRemoveOperationType:[self.resources removeObject:operation.value];break;}}} error:nil];[manager GET:@"http://example.com/resources"parameters:nilsuccess:^(NSHTTPURLResponse *response, id responseObject){self.resources = responseObject;} failure:nil];
rocket.github.io
heliosan extensible open sourcemobile backend framework
Helios Services• Data Synchronization• Push Notification Registration• In-App Purchase• Passbook Webservice• Newsstand Syndication• Logging & Analytics
require 'bundler'Bundler.requireapp = Helios::Application.new {service :data, model: "Model.xcdatamodel"service :push_notificationservice :in_app_purchaseservice :passbook}run app
helios.io
AFNetworking 2.0 GASoon!
@mattt
One more thing...
AFNetworkingthe definitive guide
AFNetworkingthe definitive guideComing Fall 2013
Thank !