Commit df7ba142 by Dima Bart

Wrap NSURLSessionTask in a BUYRequestOperation.

parent 2e1154ad
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#import "BUYClient+Internal.h" #import "BUYClient+Internal.h"
#import "BUYApplePayToken.h" #import "BUYApplePayToken.h"
#import "BUYApplePayTestToken.h" #import "BUYApplePayTestToken.h"
#import "BUYRequestOperation.h"
NSString * const BUYFakeCustomerToken = @"dsfasdgafdg"; NSString * const BUYFakeCustomerToken = @"dsfasdgafdg";
...@@ -46,7 +47,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg"; ...@@ -46,7 +47,7 @@ NSString * const BUYFakeCustomerToken = @"dsfasdgafdg";
@implementation BUYClient_Test @implementation BUYClient_Test
- (void)startTask:(NSURLSessionDataTask *)task - (void)startTask:(BUYRequestOperation *)task
{ {
// Do nothing // Do nothing
} }
......
...@@ -359,6 +359,10 @@ ...@@ -359,6 +359,10 @@
9A0B0C731CEB52B90037D68F /* BUYClient+Checkout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A0B0C701CEB52B90037D68F /* BUYClient+Checkout.h */; }; 9A0B0C731CEB52B90037D68F /* BUYClient+Checkout.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A0B0C701CEB52B90037D68F /* BUYClient+Checkout.h */; };
9A0B0C741CEB52B90037D68F /* BUYClient+Checkout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A0B0C711CEB52B90037D68F /* BUYClient+Checkout.m */; }; 9A0B0C741CEB52B90037D68F /* BUYClient+Checkout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A0B0C711CEB52B90037D68F /* BUYClient+Checkout.m */; };
9A0B0C751CEB52B90037D68F /* BUYClient+Checkout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A0B0C711CEB52B90037D68F /* BUYClient+Checkout.m */; }; 9A0B0C751CEB52B90037D68F /* BUYClient+Checkout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A0B0C711CEB52B90037D68F /* BUYClient+Checkout.m */; };
9A0B0C5D1CE662EC0037D68F /* BUYRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A585C121CE65811001F20F0 /* BUYRequestOperation.m */; };
9A0B0C5E1CE662ED0037D68F /* BUYRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A585C121CE65811001F20F0 /* BUYRequestOperation.m */; };
9A0B0C5F1CE662EF0037D68F /* BUYRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A585C111CE65811001F20F0 /* BUYRequestOperation.h */; };
9A0B0C601CE662EF0037D68F /* BUYRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A585C111CE65811001F20F0 /* BUYRequestOperation.h */; };
9A102D1B1CDD1F960026CC43 /* BUYErrorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A102D1A1CDD1F960026CC43 /* BUYErrorTests.m */; }; 9A102D1B1CDD1F960026CC43 /* BUYErrorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A102D1A1CDD1F960026CC43 /* BUYErrorTests.m */; };
9A102D1E1CDD25980026CC43 /* BUYOptionValueTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A102D1D1CDD25980026CC43 /* BUYOptionValueTests.m */; }; 9A102D1E1CDD25980026CC43 /* BUYOptionValueTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A102D1D1CDD25980026CC43 /* BUYOptionValueTests.m */; };
9A47CEFD1CE39F6000A6D5BA /* BUYCreditCardToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A47CEFB1CE39F5B00A6D5BA /* BUYCreditCardToken.m */; }; 9A47CEFD1CE39F6000A6D5BA /* BUYCreditCardToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A47CEFB1CE39F5B00A6D5BA /* BUYCreditCardToken.m */; };
...@@ -680,6 +684,8 @@ ...@@ -680,6 +684,8 @@
9A585C031CE6440B001F20F0 /* BUYCheckoutOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYCheckoutOperation.m; sourceTree = "<group>"; }; 9A585C031CE6440B001F20F0 /* BUYCheckoutOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYCheckoutOperation.m; sourceTree = "<group>"; };
9A585C041CE6440B001F20F0 /* BUYOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUYOperation.h; sourceTree = "<group>"; }; 9A585C041CE6440B001F20F0 /* BUYOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUYOperation.h; sourceTree = "<group>"; };
9A585C051CE6440B001F20F0 /* BUYOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYOperation.m; sourceTree = "<group>"; }; 9A585C051CE6440B001F20F0 /* BUYOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYOperation.m; sourceTree = "<group>"; };
9A585C111CE65811001F20F0 /* BUYRequestOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUYRequestOperation.h; sourceTree = "<group>"; };
9A585C121CE65811001F20F0 /* BUYRequestOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYRequestOperation.m; sourceTree = "<group>"; };
9A6B03781CDA5D4F0054C26E /* BUYAccountCredentialsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYAccountCredentialsTests.m; sourceTree = "<group>"; }; 9A6B03781CDA5D4F0054C26E /* BUYAccountCredentialsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYAccountCredentialsTests.m; sourceTree = "<group>"; };
9ABBCC9F1CF5C9D10075B0C5 /* BUYFakeSafariController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUYFakeSafariController.h; sourceTree = "<group>"; }; 9ABBCC9F1CF5C9D10075B0C5 /* BUYFakeSafariController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BUYFakeSafariController.h; sourceTree = "<group>"; };
9ABBCCA01CF5C9D10075B0C5 /* BUYFakeSafariController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYFakeSafariController.m; sourceTree = "<group>"; }; 9ABBCCA01CF5C9D10075B0C5 /* BUYFakeSafariController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BUYFakeSafariController.m; sourceTree = "<group>"; };
...@@ -1060,6 +1066,8 @@ ...@@ -1060,6 +1066,8 @@
9A585C031CE6440B001F20F0 /* BUYCheckoutOperation.m */, 9A585C031CE6440B001F20F0 /* BUYCheckoutOperation.m */,
9A585C041CE6440B001F20F0 /* BUYOperation.h */, 9A585C041CE6440B001F20F0 /* BUYOperation.h */,
9A585C051CE6440B001F20F0 /* BUYOperation.m */, 9A585C051CE6440B001F20F0 /* BUYOperation.m */,
9A585C111CE65811001F20F0 /* BUYRequestOperation.h */,
9A585C121CE65811001F20F0 /* BUYRequestOperation.m */,
); );
path = Operations; path = Operations;
sourceTree = "<group>"; sourceTree = "<group>";
...@@ -1303,6 +1311,7 @@ ...@@ -1303,6 +1311,7 @@
841ADE101CB6C942000004B0 /* NSDictionary+BUYAdditions.h in Headers */, 841ADE101CB6C942000004B0 /* NSDictionary+BUYAdditions.h in Headers */,
841ADE1C1CB6C942000004B0 /* NSString+BUYAdditions.h in Headers */, 841ADE1C1CB6C942000004B0 /* NSString+BUYAdditions.h in Headers */,
841ADE181CB6C942000004B0 /* NSRegularExpression+BUYAdditions.h in Headers */, 841ADE181CB6C942000004B0 /* NSRegularExpression+BUYAdditions.h in Headers */,
9A0B0C5F1CE662EF0037D68F /* BUYRequestOperation.h in Headers */,
9A47CEFF1CE39F6400A6D5BA /* BUYCreditCardToken.h in Headers */, 9A47CEFF1CE39F6400A6D5BA /* BUYCreditCardToken.h in Headers */,
841ADE0C1CB6C942000004B0 /* NSDecimalNumber+BUYAdditions.h in Headers */, 841ADE0C1CB6C942000004B0 /* NSDecimalNumber+BUYAdditions.h in Headers */,
84980F331CB75C2900CFAB58 /* NSEntityDescription+BUYAdditions.h in Headers */, 84980F331CB75C2900CFAB58 /* NSEntityDescription+BUYAdditions.h in Headers */,
...@@ -1411,6 +1420,7 @@ ...@@ -1411,6 +1420,7 @@
841ADDFF1CB6C942000004B0 /* NSArray+BUYAdditions.h in Headers */, 841ADDFF1CB6C942000004B0 /* NSArray+BUYAdditions.h in Headers */,
841ADE1B1CB6C942000004B0 /* NSString+BUYAdditions.h in Headers */, 841ADE1B1CB6C942000004B0 /* NSString+BUYAdditions.h in Headers */,
841ADE171CB6C942000004B0 /* NSRegularExpression+BUYAdditions.h in Headers */, 841ADE171CB6C942000004B0 /* NSRegularExpression+BUYAdditions.h in Headers */,
9A0B0C601CE662EF0037D68F /* BUYRequestOperation.h in Headers */,
9A47CF001CE39F6400A6D5BA /* BUYCreditCardToken.h in Headers */, 9A47CF001CE39F6400A6D5BA /* BUYCreditCardToken.h in Headers */,
841ADE0B1CB6C942000004B0 /* NSDecimalNumber+BUYAdditions.h in Headers */, 841ADE0B1CB6C942000004B0 /* NSDecimalNumber+BUYAdditions.h in Headers */,
84980F321CB75C2900CFAB58 /* NSEntityDescription+BUYAdditions.h in Headers */, 84980F321CB75C2900CFAB58 /* NSEntityDescription+BUYAdditions.h in Headers */,
...@@ -1686,6 +1696,7 @@ ...@@ -1686,6 +1696,7 @@
901931051BC5B9BC00D1134E /* BUYOptionSelectionNavigationController.m in Sources */, 901931051BC5B9BC00D1134E /* BUYOptionSelectionNavigationController.m in Sources */,
9A585C091CE6440B001F20F0 /* BUYCheckoutOperation.m in Sources */, 9A585C091CE6440B001F20F0 /* BUYCheckoutOperation.m in Sources */,
901931061BC5B9BC00D1134E /* BUYDiscount.m in Sources */, 901931061BC5B9BC00D1134E /* BUYDiscount.m in Sources */,
9A0B0C5D1CE662EC0037D68F /* BUYRequestOperation.m in Sources */,
84DD129A1CC63FE600A2442D /* _BUYCart.m in Sources */, 84DD129A1CC63FE600A2442D /* _BUYCart.m in Sources */,
841ADE0A1CB6C942000004B0 /* NSDateFormatter+BUYAdditions.m in Sources */, 841ADE0A1CB6C942000004B0 /* NSDateFormatter+BUYAdditions.m in Sources */,
901931081BC5B9BC00D1134E /* BUYRuntime.m in Sources */, 901931081BC5B9BC00D1134E /* BUYRuntime.m in Sources */,
...@@ -1830,6 +1841,7 @@ ...@@ -1830,6 +1841,7 @@
BEB74A2A1B554BFB0005A300 /* BUYOptionSelectionNavigationController.m in Sources */, BEB74A2A1B554BFB0005A300 /* BUYOptionSelectionNavigationController.m in Sources */,
9A585C081CE6440B001F20F0 /* BUYCheckoutOperation.m in Sources */, 9A585C081CE6440B001F20F0 /* BUYCheckoutOperation.m in Sources */,
BE9A64501B503CAD0033E558 /* BUYDiscount.m in Sources */, BE9A64501B503CAD0033E558 /* BUYDiscount.m in Sources */,
9A0B0C5E1CE662ED0037D68F /* BUYRequestOperation.m in Sources */,
84DD12821CC63FE600A2442D /* _BUYCart.m in Sources */, 84DD12821CC63FE600A2442D /* _BUYCart.m in Sources */,
841ADE091CB6C942000004B0 /* NSDateFormatter+BUYAdditions.m in Sources */, 841ADE091CB6C942000004B0 /* NSDateFormatter+BUYAdditions.m in Sources */,
BE9A646F1B503D210033E558 /* BUYRuntime.m in Sources */, BE9A646F1B503D210033E558 /* BUYRuntime.m in Sources */,
......
...@@ -94,6 +94,11 @@ NS_ASSUME_NONNULL_BEGIN ...@@ -94,6 +94,11 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, strong, nonnull) BUYModelManager *modelManager; @property (nonatomic, strong, nonnull) BUYModelManager *modelManager;
/** /**
* Queue where on which all request operation are executed
*/
@property (nonatomic, strong, nonnull) NSOperationQueue *requestQueue;
/**
* Queue where callbacks will be called * Queue where callbacks will be called
* defaults to main queue * defaults to main queue
*/ */
......
...@@ -64,6 +64,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -64,6 +64,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
self.appId = appId; self.appId = appId;
self.applicationName = [[NSBundle mainBundle] infoDictionary][@"CFBundleName"] ?: @""; self.applicationName = [[NSBundle mainBundle] infoDictionary][@"CFBundleName"] ?: @"";
self.queue = dispatch_get_main_queue(); self.queue = dispatch_get_main_queue();
self.requestQueue = [NSOperationQueue new];
self.session = [self urlSession]; self.session = [self urlSession];
self.pageSize = 25; self.pageSize = 25;
} }
...@@ -80,7 +81,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -80,7 +81,7 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
config.HTTPAdditionalHeaders = @{@"User-Agent": [NSString stringWithFormat:@"Mobile Buy SDK iOS/%@/%@", BUYClientVersionString, bundleIdentifier]}; config.HTTPAdditionalHeaders = @{@"User-Agent": [NSString stringWithFormat:@"Mobile Buy SDK iOS/%@/%@", BUYClientVersionString, bundleIdentifier]};
return [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; return [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:self.requestQueue];
} }
- (void)setPageSize:(NSUInteger)pageSize - (void)setPageSize:(NSUInteger)pageSize
...@@ -149,9 +150,9 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -149,9 +150,9 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
#pragma mark - Generic Requests #pragma mark - Generic Requests
- (void)startTask:(NSURLSessionDataTask *)task - (void)startTask:(BUYRequestOperation *)task
{ {
[task resume]; [self.requestQueue addOperation:task];
} }
- (NSString *)authorizationHeader - (NSString *)authorizationHeader
...@@ -176,26 +177,15 @@ static NSString * const BUYClientJSONMimeType = @"application/json"; ...@@ -176,26 +177,15 @@ static NSString * const BUYClientJSONMimeType = @"application/json";
} }
request.HTTPMethod = method; request.HTTPMethod = method;
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
BUYRequestOperation *operation = [[BUYRequestOperation alloc] initWithSession:self.session request:request payload:object completion:^(NSDictionary *json, NSURLResponse *response, NSError *error) {
NSDictionary *json = nil;
if (data.length > 2) { // 2 is the minimum amount of data {} for a JSON Object. Just ignore anything less.
json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}
NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
BOOL isSuccessful = (statusCode / 100) == 2;
if (!isSuccessful && !error) { // Only generate error if request failed
error = [self errorFromJSON:json response:response];
}
dispatch_async(self.queue, ^{ dispatch_async(self.queue, ^{
completionHandler(json, response, error); completionHandler(json, response, error);
}); });
}]; }];
[self startTask:task]; [self startTask:operation];
return task; return (id)operation;
} }
#pragma mark - NSURLSessionTaskDelegate #pragma mark - NSURLSessionTaskDelegate
......
//
// BUYRequestOperation.h
// Mobile Buy SDK
//
// Created by Dima Bart on 2016-05-13.
// Copyright © 2016 Shopify Inc. All rights reserved.
//
#import "BUYOperation.h"
NS_ASSUME_NONNULL_BEGIN
@protocol BUYSerializable;
typedef NS_ENUM(NSUInteger, BUYRequestMethod) {
BUYRequestMethodGET,
BUYRequestMethodPOST,
BUYRequestMethodPUT,
BUYRequestMethodPATCH,
BUYRequestMethodDELETE,
};
typedef void (^BUYRequestOperationCompletion)(NSDictionary * _Nullable json, NSURLResponse * _Nullable response, NSError * _Nullable error);
@interface BUYRequestOperation : BUYOperation
@property (strong, nonatomic, readonly, nonnull) NSURLSession *session;
@property (strong, nonatomic, readonly, nonnull) NSURLRequest *originalRequest;
- (instancetype)initWithSession:(NSURLSession *)session request:(NSURLRequest *)request payload:(id<BUYSerializable> _Nullable)payload completion:(BUYRequestOperationCompletion)completion;
@end
NS_ASSUME_NONNULL_END
//
// BUYRequestOperation.m
// Mobile Buy SDK
//
// Created by Dima Bart on 2016-05-13.
// Copyright © 2016 Shopify Inc. All rights reserved.
//
#import "BUYRequestOperation.h"
#import "BUYSerializable.h"
NSString * const kShopifyError = @"shopify";
#pragma mark - NSURLResponse -
@interface NSHTTPURLResponse (Conveniece)
@property (assign, nonatomic, readonly) BOOL successful;
@end
@implementation NSHTTPURLResponse (Conveniece)
- (BOOL)successful {
return ((NSUInteger)(self.statusCode / 100)) == 2;
}
@end
#pragma mark - BUYOperation Private -
@interface BUYOperation (Private)
- (void)setExecuting:(BOOL)executing;
- (void)setFinished:(BOOL)finished;
@end
#pragma mark - BUYRequestOperation -
@interface BUYRequestOperation ()
@property (strong, nonatomic) BUYRequestOperationCompletion completion;
@end
@implementation BUYRequestOperation
#pragma mark - Init -
- (instancetype)initWithSession:(NSURLSession *)session request:(NSURLRequest *)request payload:(id<BUYSerializable>)payload completion:(BUYRequestOperationCompletion)completion
{
self = [super init];
if (self) {
_session = session;
_originalRequest = request;
_completion = completion;
}
return self;
}
#pragma mark - Completion -
- (void)finishWithJSON:(id)JSON response:(NSHTTPURLResponse *)response
{
[self setExecuting:NO];
self.completion(JSON, response, nil);
}
- (void)finishWithError:(NSError *)error response:(NSHTTPURLResponse *)response
{
[self setExecuting:NO];
self.completion(nil, response, error);
}
- (void)finishByCancellation
{
[self setFinished:YES];
[self setExecuting:NO];
}
#pragma mark - Start -
- (void)start
{
[super start];
if (self.isCancelled) {
[self finishByCancellation];
return;
}
[self setExecuting:YES];
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:self.originalRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (self.isCancelled) {
[self finishByCancellation];
return;
}
NSDictionary *json = nil;
if (data.length > 2) { // 2 is the minimum amount of data {} for a JSON Object. Just ignore anything less.
json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}
NSHTTPURLResponse *httpResponse = (id)response;
if (httpResponse.successful) {
[self finishWithJSON:json response:httpResponse];
} else {
if (!error) {
error = [[NSError alloc] initWithDomain:kShopifyError code:httpResponse.statusCode userInfo:json];
}
[self finishWithError:error response:httpResponse];
}
}];
[task resume];
}
#pragma mark - BUYRequestMethod -
//static inline NSString * BUYRequestMethodString(BUYRequestMethod method)
//{
// switch (method) {
// case BUYRequestMethodGET: return @"GET";
// case BUYRequestMethodPOST: return @"POST";
// case BUYRequestMethodPATCH: return @"PATCH";
// case BUYRequestMethodPUT: return @"PUT";
// case BUYRequestMethodDELETE: return @"DELETE";
// }
//}
@end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment