Skip to content

Commit 811bbb5

Browse files
committed
Updates to the model layer for AFNetworkign 2.0
1 parent 15e091b commit 811bbb5

8 files changed

+61
-49
lines changed

MAPIClient.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#define NOTIF_MODEL_CHANGED @"m_model_changed"
1414
#define NOTIF_API_QUEUE_CHANGED @"m_api_queue_changed"
1515

16-
@interface MAPIClient : AFHTTPClient
16+
@interface MAPIClient : AFHTTPRequestOperationManager
1717
{
1818
NSMutableArray * _transactionsQueue;
1919
BOOL _hasDisplayedDisconnectionNotice;
@@ -32,8 +32,8 @@
3232

3333
#pragma mark Requesting Object Data
3434

35-
- (void)getModelAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback;
36-
- (void)getCollectionAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback;
35+
- (void)dictionaryAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback;
36+
- (void)arrayAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback;
3737
- (void)requestPath:(NSString*)path withMethod:(NSString*)method withParameters: params userTriggered:(BOOL)triggered expectedClass:(Class)expectation success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback;
3838

3939
- (MModel*)globalObjectWithID:(NSString*)ID ofClass:(Class)type;
@@ -49,7 +49,7 @@
4949

5050
#pragma mark Handling Request Results
5151

52-
- (void)criticalRequestFailed:(NSError*)err;
52+
- (void)displayNetworkError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation withGoal:(NSString*)goal;
5353

5454

5555
@end

MAPIClient.m

+38-42
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,14 @@ - (id)initWithBaseURL:(NSURL *)url
3030
{
3131
self = [super initWithBaseURL:url];
3232
if (self) {
33-
[self registerHTTPOperationClass: [AFJSONRequestOperation class]];
34-
[self setDefaultHeader:@"Accept" value:@"application/json"];
35-
[self setAllowsInvalidSSLCertificate: YES];
36-
37-
typeof(self) __weak __self = self;
38-
[self setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
39-
[__self apiReachabilityChanged: status];
40-
}];
33+
[self setRequestSerializer: [AFJSONRequestSerializer serializer]];
34+
[self setResponseSerializer: [AFJSONResponseSerializer serializerWithReadingOptions: NSJSONReadingAllowFragments]];
4135

4236
@try {
4337
if ([[NSFileManager defaultManager] fileExistsAtPath: PATH_STORE_STATE]) {
4438
NSDictionary * dict = [NSKeyedUnarchiver unarchiveObjectWithFile: PATH_STORE_STATE];
4539
_globalObjectStore = [dict objectForKey:@"objectStore"];
46-
_user = [dict objectForKey:@"user"];
40+
[self setUser: [dict objectForKey:@"user"]];
4741
}
4842

4943
if ([[NSFileManager defaultManager] fileExistsAtPath: PATH_ACTIONS_STATE])
@@ -58,13 +52,12 @@ - (id)initWithBaseURL:(NSURL *)url
5852
if (!_transactionsQueue)
5953
_transactionsQueue = [NSMutableArray array];
6054
[self performNextAction];
61-
62-
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
6355
}
6456
return self;
6557
}
6658

67-
- (void)apiReachabilityChanged:(AFNetworkReachabilityStatus)status {
59+
- (void)apiReachabilityChanged:(AFNetworkReachabilityStatus)status
60+
{
6861
if (status == AFNetworkReachabilityStatusNotReachable) {
6962
if (!_hasDisplayedDisconnectionNotice) {
7063
_hasDisplayedDisconnectionNotice = YES;
@@ -104,38 +97,40 @@ - (void)updateDiskCacheDebounced
10497

10598
#pragma mark Requesting Object Data
10699

107-
- (void)getModelAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback
100+
- (void)dictionaryAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback
108101
{
109102
[self requestPath:path withMethod:@"GET" withParameters:nil userTriggered:triggered expectedClass:[NSDictionary class] success:successCallback failure:failureCallback];
110103
}
111104

112-
- (void)getCollectionAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback
105+
- (void)arrayAtPath:(NSString*)path userTriggered:(BOOL)triggered success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback
113106
{
114107
[self requestPath:path withMethod:@"GET" withParameters:nil userTriggered:triggered expectedClass:[NSArray class] success:successCallback failure:failureCallback];
115108
}
116109

117110
- (void)requestPath:(NSString*)path withMethod:(NSString*)method withParameters: params userTriggered:(BOOL)triggered expectedClass:(Class)expectation success:(void (^)(id responseObject))successCallback failure:(void (^)(NSError *err))failureCallback
118111
{
119-
NSURLRequest *request = [self requestWithMethod:method path:path parameters:params];
120-
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
112+
if (!self.baseURL)
113+
@throw [NSException exceptionWithName:@"Cannot make request" reason:@"Base URL is not defined." userInfo:nil];
114+
115+
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:path relativeToURL:self.baseURL] absoluteString] parameters:params error:nil];
116+
AFHTTPRequestOperation * operation = [self HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
121117
if (expectation && ([responseObject isKindOfClass: expectation] == NO)) {
122-
NSError * err = [NSError errorWithExpectationFailure: [responseObject class]];
118+
NSError * error = [NSError errorWithExpectationFailure: [responseObject class]];
123119
if (triggered)
124-
[self criticalRequestFailed: err];
120+
[self displayNetworkError:error forOperation:operation withGoal:@"Request"];
125121
if (failureCallback)
126-
failureCallback(err);
122+
failureCallback(error);
127123
return;
128124
}
129125
successCallback(responseObject);
130-
131-
} failure:^(AFHTTPRequestOperation *operation, NSError *err) {
126+
127+
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
132128
if (triggered)
133-
[self criticalRequestFailed: err];
129+
[self displayNetworkError:error forOperation:operation withGoal:@"Request"];
134130
if (failureCallback)
135-
failureCallback(err);
131+
failureCallback(error);
136132
}];
137-
138-
[self enqueueHTTPRequestOperation:operation];
133+
[self.operationQueue addOperation:operation];
139134
}
140135

141136
- (MModel*)globalObjectWithID:(NSString*)ID ofClass:(Class)type
@@ -158,8 +153,10 @@ - (void)addGlobalObject:(MModel*)model
158153
- (void)setUser:(MUser *)user
159154
{
160155
_user = user;
161-
if (user == nil)
162-
[self clearAuthorizationHeader];
156+
if (user)
157+
[[self requestSerializer] setAuthorizationHeaderFieldWithUsername:[user credentialUsername] password:[user credentialPassword]];
158+
else
159+
[[self requestSerializer] clearAuthorizationHeader];
163160

164161
[self updateDiskCache: YES];
165162
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_USER_CHANGED object:nil];
@@ -179,7 +176,7 @@ - (void)queueAPITransaction:(MAPITransaction*)a
179176
return;
180177

181178
[_transactionsQueue addObject: a];
182-
if (([self networkReachabilityStatus] != AFNetworkReachabilityStatusNotReachable) && (![a started]))
179+
if (([[self reachabilityManager] networkReachabilityStatus] != AFNetworkReachabilityStatusNotReachable) && (![a started]))
183180
[a performDeferred];
184181

185182
NSLog(@"API: Queued API action: %@", [a description]);
@@ -212,7 +209,7 @@ - (void)finishedAPITransaction:(MAPITransaction*)a withError:(NSError*)err
212209
} else if (err) {
213210
// TODO: Additional logic was here... Do we always want to throw away the transaction if it fails once?
214211
[self dequeueAPITransaction: a];
215-
[self criticalRequestFailed: err];
212+
[self displayNetworkError:err forOperation:nil withGoal:@"Request"];
216213
}
217214
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_API_QUEUE_CHANGED object:nil];
218215
}
@@ -226,7 +223,7 @@ - (void)dequeueAPITransaction:(MAPITransaction*)a
226223

227224
- (void)performNextActionIfReconnected
228225
{
229-
if ([self networkReachabilityStatus] != AFNetworkReachabilityStatusNotReachable)
226+
if ([[self reachabilityManager] networkReachabilityStatus] != AFNetworkReachabilityStatusNotReachable)
230227
[self performNextAction];
231228
else {
232229
NSString * msg = @"Please connect to the internet and try to sync again.";
@@ -248,24 +245,23 @@ - (void)performNextAction
248245

249246
#pragma mark Handling Request Results
250247

251-
- (void)criticalRequestFailed:(NSError*)err
248+
- (void)displayNetworkError:(NSError*)error forOperation:(AFHTTPRequestOperation*)operation withGoal:(NSString*)goal
252249
{
253-
NSData * jsonData = [[err.userInfo objectForKey: @"NSLocalizedRecoverySuggestion"] dataUsingEncoding: NSUTF8StringEncoding];
254-
NSString * message = err.localizedDescription;
255-
256-
if (jsonData) {
257-
NSDictionary * json = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:NULL];
258-
if (json) message = [json objectForKey: @"error"];
259-
}
250+
NSString * message = nil;
260251

261-
if ([err code] == 401)
252+
if ([[operation responseObject] objectForKey: @"error"])
253+
message = [[operation responseObject] objectForKey: @"error"];
254+
255+
else if (([error code] == 401) || ([[operation response] statusCode] == 401))
262256
message = @"Please check your email address and password.";
263257

264-
if (message && [message isKindOfClass: [NSString class]])
265-
[[[UIAlertView alloc] initWithTitle:@"Error" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
258+
else
259+
message = [error localizedDescription];
266260

267-
[[NSNotificationCenter defaultCenter] postNotificationName:NOTIF_API_QUEUE_CHANGED object:nil];
261+
NSString * title = [goal stringByAppendingString: @" Failed"];
262+
[[[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show];
268263
}
269264

270265

266+
271267
@end

MModel.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ - (void)save:(MAPITransactionCallback)callback
173173

174174
- (void)reload:(MAPITransactionCallback)callback
175175
{
176-
[[MAPIClient shared] getModelAtPath:[self resourcePath] userTriggered:NO success:^(id responseObject) {
176+
[[MAPIClient shared] dictionaryAtPath:[self resourcePath] userTriggered:NO success:^(id responseObject) {
177177
[self updateWithResourceJSON: responseObject];
178178
if (callback) callback(YES);
179179

MModelCollection.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ - (void)updateFromPath:(NSString*)path replaceExistingContents:(BOOL)replace wit
172172

173173
_refreshInProgress = YES;
174174

175-
[[MAPIClient shared] getCollectionAtPath:path userTriggered:NO success:^(id responseObject) {
175+
[[MAPIClient shared] arrayAtPath:path userTriggered:NO success:^(id responseObject) {
176176
_loadReturnedLessThanRequested = ([responseObject count] < _collectionPageSize);
177177
[self updateWithResourceJSON: responseObject discardMissingModels: replace];
178178
[self setRefreshDate: [NSDate date]];

MUser.h

+3
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@
1010

1111
@interface MUser : MModel
1212

13+
- (NSString*)credentialUsername;
14+
- (NSString*)credentialPassword;
15+
1316
@end

MUser.m

+10
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,14 @@
1010

1111
@implementation MUser
1212

13+
- (NSString*)credentialUsername
14+
{
15+
return nil;
16+
}
17+
18+
- (NSString*)credentialPassword
19+
{
20+
return nil;
21+
}
22+
1323
@end

NSObject+AssociatedObjects.m

+3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ - (void)performSelectorOnMainThreadOnce:(SEL)selector
3131

3232
dispatch_async(dispatch_get_main_queue(), ^{
3333
if ([self associatedValueForKey: (void*)selector]) {
34+
#pragma clang diagnostic push
35+
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
3436
[self performSelector: selector];
37+
#pragma clang diagnostic pop
3538
[self associateValue:nil withKey:(void*)selector];
3639
}
3740
});

UIColor-Expanded.m

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ - (NSString *)stringFromColor {
306306
}
307307

308308
- (NSString *)hexStringFromColor {
309-
return [NSString stringWithFormat:@"%0.6X", self.rgbHex];
309+
return [NSString stringWithFormat:@"%0.6X", (unsigned int)self.rgbHex];
310310
}
311311

312312
+ (UIColor *)colorWithString:(NSString *)stringToConvert {

0 commit comments

Comments
 (0)