TNLExample/TNLXDummy.m (95 lines of code) (raw):

// // TNLXDummy.m // TwitterNetworkLayer // // Created on 8/29/14. // Copyright © 2020 Twitter. All rights reserved. // #import <TwitterNetworkLayer/TwitterNetworkLayer.h> #import "TNLXDummy.h" // TODO:[nobrien] - improve this dummy code /* For each network type (NSURL and TNL) Create a VC to do 1 simple request Create a VC to do a chain of requests (bing search followed by auto rendering the image and displaying it) Just for TNL create a stub VC playground */ #define NSURL_MODE 0 @interface DummyVC () @property (nonatomic) id action; @property (nonatomic) NSURLSession *session; @property (nonatomic) NSURLSessionTask *task; @property (nonatomic) NSArray *ops; @property (nonatomic) NSArray *tasks; @property (nonatomic) BOOL loaded; @property (nonatomic) NSOperation *someOperationToDependOn; - (void)startNetworkOperationIfNeeded; - (void)handleCompletedAction:(id)action URLResponse:(NSURLResponse *)r data:(NSData *)data error:(NSError *)error originalRequest:(id<TNLRequest>)originalReq hydratedRequest:(id<TNLRequest>)hydratedReq finalRequest:(id<TNLRequest>)finalReq uploadProgress:(float)uploadProgress downloadProgress:(float)downloadProgress retryCount:(NSUInteger)retryCount wasCancelled:(BOOL)wasCancelled; @end @implementation DummyVC - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self startNetworkOperationIfNeeded]; } - (void)dealloc { [self.action cancel]; } - (void)startNetworkOperationIfNeeded { if (self.loaded || self.action) { return; } NSURL *someURL = [NSURL URLWithString:@"http://twitter.com/some/url"]; __weak typeof(self) weakSelf = self; #if NSURL_MODE NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; self.session = [NSURLSession sessionWithConfiguration:config]; self.action = [self.session dataTaskWithURL:someURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { typeof(self) strongSelf = weakSelf; if (strongSelf) { [strongSelf handleTask:strongSelf.task response:response data:data error:error]; } }]; [self.action resume]; #else self.action = [TNLRequestOperation operationWithURL:someURL completion:^(TNLRequestOperation *op, TNLResponse *response) { [weakSelf handleRequestOperation:op response:response]; }]; // Can interact with NSOperation interface [self.action addDependency:self.someOperationToDependOn]; [self.action setCompletionBlock:^{ NSLog(@"Sweet! We can add a completion block that is separate from the callback/delegate system like any other NSOperation!"); }]; [[TNLRequestOperationQueue defaultOperationQueue] enqueueRequestOperation:self.action]; // or, if no NSOperation work needs to be configured, enqueueRequestWithURL:completion: could have been called #endif } #if NSURL_MODE - (void)handleTask:(NSURLSessionTask *)task response:(NSURLResponse *)r data:(NSData *)data error:(NSError *)error { self.session = nil; BOOL wasCancelled = [error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled; float uploadProgress = (task.countOfBytesExpectedToSend > 0) ? (double)task.countOfBytesSent / (double)task.countOfBytesExpectedToSend : 0; // not always available float downloadProgress = (task.countOfBytesExpectedToReceive > 0) ? (double)task.countOfBytesReceived / (double)task.countOfBytesExpectedToReceive : 0; // not always available [self handleCompletedAction:task URLResponse:r data:data error:error originalRequest:task.originalRequest hydratedRequest:task.originalRequest /* always the original */ finalRequest:task.currentRequest uploadProgress:uploadProgress downloadProgress:downloadProgress retryCount:0 /* no such thing */ wasCancelled:wasCancelled]; } #else - (void)handleRequestOperation:(TNLRequestOperation *)op response:(TNLResponse *)r { BOOL wasCancelled = [r.operationError.domain isEqualToString:TNLErrorDomain] && r.operationError.code == TNLErrorCodeRequestOperationCancelled; [self handleCompletedAction:op URLResponse:r.info.URLResponse data:r.info.data error:r.operationError originalRequest:op.originalRequest hydratedRequest:op.hydratedRequest finalRequest:r.info.finalURLRequest uploadProgress:op.uploadProgress downloadProgress:op.downloadProgress retryCount:(op.attemptCount > 0) ? op.attemptCount - 1 : 0 wasCancelled:wasCancelled]; } #endif - (void)handleCompletedAction:(id)action URLResponse:(NSURLResponse *)r data:(NSData *)data error:(NSError *)error originalRequest:(id<TNLRequest>)originalReq hydratedRequest:(id<TNLRequest>)hydratedReq finalRequest:(id<TNLRequest>)finalReq uploadProgress:(float)uploadProgress downloadProgress:(float)downloadProgress retryCount:(NSUInteger)retryCount wasCancelled:(BOOL)wasCancelled { assert(action == self.action); self.action = nil; self.loaded = YES; } @end