Skip to content

Instantly share code, notes, and snippets.

@khanlou
Created January 22, 2015 20:53
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save khanlou/e0bc14836a4647a1ca8a to your computer and use it in GitHub Desktop.
Save khanlou/e0bc14836a4647a1ca8a to your computer and use it in GitHub Desktop.
New Networking
//
// RGJSONResponseTransformer.m
// RapGenius
//
// Created by Soroush Khanlou on 1/20/15.
// Copyright (c) 2015 Genius. All rights reserved.
//
#import "RGJSONResponseTransformer.h"
#import <NSObject+JSON.h>
#import <NSString+DataConversion.h>
@implementation RGJSONResponseTransformer
- (id)transformResponse:(NSURLResponse *)response andData:(NSData *)data {
return data.stringRepresentation.objectFromJSONString;
}
@end
//
// RGLoginRequest.m
// RapGenius
//
// Created by Soroush Khanlou on 1/20/15.
// Copyright (c) 2015 Genius. All rights reserved.
//
#import "RGLoginRequest.h"
#import "RGJSONResponseTransformer.h"
@implementation RGLoginRequest
- (instancetype)initWithUserName:(NSString *)username password:(NSString *)password {
if (!username || !password) {
self = nil;
return nil;
}
self = [super init];
if (!self) return nil;
_username = username;
_password = password;
return self;
}
- (NSString *)method {
return @"POST";
}
- (NSURL *)baseURL {
return [NSURL URLWithString:@"https://api.genius.com"];
}
- (NSString *)path {
return @"/sessions";
}
- (NSDictionary *)parameters {
return @{
@"user":
@{
@"login": self.username,
@"password": self.password,
}
};
}
- (NSDictionary *)headers {
return @{
@"Accept": @"application/json",
@"Content-Type": @"application/json",
};
}
- (id<RGResponseTransformer>)transformer {
return [RGJSONResponseTransformer new];
}
@end
//
// RGRequestSender.m
// RapGenius
//
// Created by Soroush Khanlou on 1/20/15.
// Copyright (c) 2015 Genius. All rights reserved.
//
#import "RGRequestSender.h"
#import <NSObject+JSON.h>
#import <NSString+DataConversion.h>
#import "RGSafeRequestTemplate.h"
@implementation RGRequestSender
- (instancetype)initWithURLSession:(NSURLSession *)session {
self = [super init];
if (!self) return nil;
_session = session;
return self;
}
- (instancetype)init {
return [self initWithURLSession:[NSURLSession sharedSession]];
}
- (void)sendRequestWithURLRequestTemplate:(id<RGRequestTemplate>)unsafeTemplate target:(id<RGRequestTarget>)target {
RGSafeRequestTemplate *safeTemplate = [[RGSafeRequestTemplate alloc] initWithTemplate:unsafeTemplate];
NSURLRequest *request = [self requestWithTemplate:safeTemplate] ;
[[self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
if ([target respondsToSelector:@selector(requestFailedWithError:)]) {
[target requestFailedWithError:error];
}
} else {
if ([target respondsToSelector:@selector(requestCompletedWithResult:)]) {
id result;
id<RGResponseTransformer> transformer = [safeTemplate transformer];
if (transformer) {
result = [transformer transformResponse:response andData:data];
} else {
result = data;
}
[target requestCompletedWithResult:result];
}
}
});
}] resume];
}
- (NSURLRequest *)requestWithTemplate:(RGSafeRequestTemplate *)safeTemplate {
NSMutableURLRequest *URLRequest = [[NSMutableURLRequest alloc] init];
URLRequest.HTTPMethod = [safeTemplate method];
URLRequest.HTTPBody = [safeTemplate parameters].JSONString.dataRepresentation;
NSURLComponents *URLComponents = [NSURLComponents componentsWithURL:[safeTemplate baseURL] resolvingAgainstBaseURL:YES];
NSString *path = [URLComponents.path stringByAppendingString:[safeTemplate path]];
URLComponents.path = path;
URLRequest.URL = URLComponents.URL;
[[safeTemplate headers] enumerateKeysAndObjectsUsingBlock:^(NSString *fieldName, NSString *value, BOOL *stop) {
[URLRequest addValue:value forHTTPHeaderField:fieldName];
}];
return URLRequest;
}
@end
//
// RGSafeRequestTemplate.m
// RapGenius
//
// Created by Soroush Khanlou on 1/20/15.
// Copyright (c) 2015 Genius. All rights reserved.
//
#import "RGSafeRequestTemplate.h"
@implementation RGSafeRequestTemplate
- (instancetype)initWithTemplate:(id<RGRequestTemplate>)template {
self = [super init];
if (!self) return nil;
_unsafeTemplate = template;
return self;
}
- (NSString *)method {
if ([self.unsafeTemplate respondsToSelector:@selector(method)]) {
return [self.unsafeTemplate method];
}
return nil;
}
- (NSURL *)baseURL {
if ([self.unsafeTemplate respondsToSelector:@selector(baseURL)]) {
return [self.unsafeTemplate baseURL];
}
return nil;
}
- (NSString *)path {
if ([self.unsafeTemplate respondsToSelector:@selector(path)]) {
return [self.unsafeTemplate path];
}
return nil;
}
- (NSDictionary *)parameters {
if ([self.unsafeTemplate respondsToSelector:@selector(parameters)]) {
return [self.unsafeTemplate parameters];
}
return nil;
}
- (NSDictionary *)headers {
if ([self.unsafeTemplate respondsToSelector:@selector(headers)]) {
return [self.unsafeTemplate headers];
}
return nil;
}
- (id<RGResponseTransformer>)transformer {
if ([self.unsafeTemplate respondsToSelector:@selector(transformer)]) {
return [self.unsafeTemplate transformer];
}
return nil;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment