$30 off During Our Annual Pro Sale. View Details »

AFNetworking 2.0

AFNetworking 2.0

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.

Mattt Thompson

August 01, 2013
Tweet

More Decks by Mattt Thompson

Other Decks in Programming

Transcript

  1. 2

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. @mattt @sco

    View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. State of the
    Library

    View Slide

  11. • 8,800+ Stars
    • 2,200+ Forks
    • 1,500+ Commits
    • 1,300+ Closed Issues
    • 130 Contributors

    View Slide

  12. Continuous Integration
    Automated Documentation

    View Slide

  13. Official Extensions
    • OAuth 1.0a
    • OAuth 2.0
    • Amazon S3
    • JSON-RPC
    • Collection+JSON
    • Logger

    View Slide

  14. Official Extensions

    View Slide

  15. Official Extensions
    http://mneorr.github.io/Alcatraz/
    Download Xcode Template with Alcatraz

    View Slide

  16. Third-Party
    Extensions
    • XAuth
    • CSV
    • iCalendar
    • HAR (HTTP Archive)
    • RSS
    • Gravatar
    • WebDav

    View Slide

  17. Built on
    AFNetworking
    RestKit NimbusKit OctoKit

    View Slide

  18. 10,000's
    Built on
    AFNetworking
    Apps Built Using AFNetworking

    View Slide

  19. View Slide

  20. View Slide

  21. These are confidential sessions—please refrain from streaming, blogging, or taking pictures
    Session 705
    What’s New in Foundation Networking

    View Slide

  22. NSURLSession

    View Slide

  23. NSURLSession
    • Session Configuration
    • URL Cache
    • Protocols
    • Cookie Storage
    • Tasks
    • Backgroundable
    • Data, Upload, & Download

    View Slide

  24. View Slide

  25. AFNetworking 2.0

    View Slide

  26. View Slide

  27. AFNetworking 2.0
    • iOS 6+ & Mac OS X 10.8+
    • Xcode 5
    • NSURLSession & NSURLConnection
    • Serialization Modules
    • UIKit Extensions
    • Real-time

    View Slide

  28. Requirements

    View Slide

  29. Serializers

    View Slide

  30. AFURLConnectionOperation
    AFHTTPRequestOperation
    AFJSONRequestOperation

    View Slide

  31. - (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
    failure:(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
    }

    View Slide

  32. - (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
    failure:(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];
    }];
    }

    View Slide

  33. op.responseSerializer = [AFJSONSerializer serializer];

    View Slide


  34. - requestBySerializingRequest:
    withParameters:
    error:
    - responseObjectForResponse:
    data:
    error:

    View Slide

  35. • Shared Between Request Operations & Session Tasks
    • Significantly Reduced Boilerplate Code
    • Pluggable & Configurable
    • Protocol, Not Subclass
    Serializers

    View Slide

  36. Built-in Serializers
    • HTTP
    • JSON
    • Property List
    • HTTP
    • JSON
    • XML Parser
    • XML Document (OSX)
    • Property List
    • Image
    Request Response

    View Slide

  37. Serializer Extensions
    • MsgPack
    • CSV / TSV
    • vCard
    • vCal
    • WebP

    View Slide

  38. Object Serialization
    • NSObject
    • NSManagedObject
    • RKManagedObject
    • MTLModel

    View Slide

  39. View Slide

  40. View Slide

  41. Changes to
    AFHTTPRequestOperation
    • You'll Actually Use it Directly!
    • @property responseSerializer
    • @property completionQueue
    • @property completionGroup

    View Slide

  42. 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];

    View Slide

  43. AFURLConnectionOperation
    AFHTTPRequestOperation
    AFJSONRequestOperation

    View Slide

  44. AFURLConnectionOperation
    AFHTTPRequestOperation

    View Slide

  45. Content Operation
    Extension
    • AFJSONRequestOperation
    • AFXMLRequestOperation
    • AFPropertyListRequestOperation
    • AFImageRequestOperation

    View Slide

  46. AFURLSessionManager

    View Slide

  47. NSURLSession
    2 Methods
    5 Methods
    4 Methods
    3 Methods

    View Slide

  48. NSURLSession
    14
    Delegate Methods

    View Slide

  49. AFURLSessionManager
    • Provides Block-based Callbacks for Delegate Methods
    • Including Default Expected Implementation
    • Provides Per-Task Upload / Download Progress Callbacks
    • Convenience Methods for Session Management

    View Slide

  50. AFHTTPClient
    the

    View Slide

  51. AFHTTPClient
    • Create Requests
    • Parameter Query String Serialization
    • Multipart Form Stream Creation
    • Default Headers
    • Create and Manage Request Operations
    • Create Batched Operations
    • Monitor Network Reachability

    View Slide

  52. New Architecture


    • AFSecurityPolicy
    • AFNetworkReachabilityManager

    View Slide

  53. New Architecture
    NSURLConnection NSURLSession
    AFHTTPRequestOperation
    AFURLConnectionOperation
    Data Upload Download
    NSURLSessionTask
    NSURLSessionTask
    NSURLSessionTask
    AFHTTPClient AFHTTPSessionManager
    AFURLSessionManager

    View Slide

  54. AFHTTPSessionManager
    • Expanded & Refactored HTTP Convenience Methods
    • Almost identical between Session & Request Operation Managers
    • Default to JSON Response Serializer
    • No Longer Requires baseURL

    View Slide

  55. - (Object *)GET:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *, id))success
    failure:(void (^)(Object *, NSError *))failure;
    - (Object *)HEAD:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *))success
    failure:(void (^)(Object *, NSError *))failure;

    View Slide

  56. - (Object *)POST:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *, id))success
    failure:(void (^)(Object *, NSError *))failure;
    - (Object *)POST:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    constructingBodyWithBlock:(void (^)(id ))block
    success:(void (^)(Object *, id))success
    failure:(void (^)(Object *, NSError *))failure;

    View Slide

  57. - (Object *)PUT:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *, id))success
    failure:(void (^)(Object *, NSError *))failure;
    - (Object *)PATCH:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *, id))success
    failure:(void (^)(Object *, NSError *))failure;
    - (Object *)DELETE:(NSString *)URLString
    parameters:(NSDictionary *)parameters
    success:(void (^)(Object *))success
    failure:(void (^)(Object *, NSError *))failure;

    View Slide

  58. - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
    completionHandler:(void (^)(
    NSHTTPURLResponse *,
    id,
    NSError *error
    ))completionHandler;

    View Slide

  59. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
    fromFile:(NSURL *)fileURL
    progress:(NSProgress **)progress
    completionHandler:(void (^)(
    NSHTTPURLResponse *,
    id,
    NSError *error
    ))completionHandler;
    - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
    fromData:(NSData *)bodyData
    progress:(NSProgress **)progress
    completionHandler:(void (^)(
    NSHTTPURLResponse *,
    id,
    NSError *error
    ))completionHandler;

    View Slide

  60. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
    progress:(NSProgress **)progress
    completionHandler:(void (^)(
    NSHTTPURLResponse *,
    NSURL *,
    NSError *error
    ))completionHandler;
    - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
    progress:(NSProgress **)progress
    completionHandler:(void (^)(
    NSHTTPURLResponse *,
    NSURL *,
    NSError *error
    ))completionHandler;

    View Slide

  61. AFSecurityPolicy
    • Evaluate Server Trust
    • Pinned Certificates
    • Pinned Public Keys
    • Validate Server Certs

    View Slide

  62. AFNetworkReachability
    Manager
    • Monitor Network
    Reachability
    • Domain
    • IP Address
    • Determine Type of
    Connection

    View Slide

  63. UIKit Extensions

    View Slide

  64. UIKit Extensions
    • Network Activity Indicator
    • UIImageView
    • UIButton
    • UIActivityIndicatorView
    • UIProgressView
    • UIWebView

    View Slide

  65. Real-time

    View Slide

  66. R O C K E T
    a hybrid approach to real-time cloud applications

    View Slide

  67. Server-Sent Events
    W3C Event Source Draft Spec
    JSON Patch
    RFC 6902

    View Slide

  68. Document Stream
    Request
    Response
    GET /resources
    Accept: application/json
    SUBSCRIBE /resources
    Accept: text/event-stream
    HTTP/1.1 200 OK
    Content-Type: application/json
    {"resources": [...]}
    HTTP/1.1 200 OK
    Content-Type: text/event-stream
    event: patch
    data: [{
    "op": "add",
    "path": "/resources/123",
    "value": {...}
    }]

    View Slide

  69. View Slide

  70. 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:nil
    success:^(NSHTTPURLResponse *response, id responseObject)
    {
    self.resources = responseObject;
    } failure:nil];

    View Slide

  71. rocket.github.io

    View Slide

  72. helios
    an extensible open source
    mobile backend framework

    View Slide

  73. Helios Services
    • Data Synchronization
    • Push Notification Registration
    • In-App Purchase
    • Passbook Webservice
    • Newsstand Syndication
    • Logging & Analytics

    View Slide

  74. require 'bundler'
    Bundler.require
    app = Helios::Application.new {
    service :data, model: "Model.xcdatamodel"
    service :push_notification
    service :in_app_purchase
    service :passbook
    }
    run app

    View Slide

  75. helios.io

    View Slide

  76. AFNetworking 2.0
    • iOS 6+ & Mac OS X 10.8+
    • Xcode 5
    • NSURLSession & NSURLConnection
    • Serialization Modules
    • UIKit Extensions
    • Real-time

    View Slide

  77. AFNetworking 2.0 GA
    Soon!

    View Slide

  78. View Slide

  79. View Slide

  80. @mattt

    View Slide

  81. One more thing...

    View Slide

  82. AFNetworking
    the definitive guide

    View Slide

  83. AFNetworking
    the definitive guide
    Coming Fall 2013

    View Slide

  84. Thank !

    View Slide