アプリを実行しているときに断続的にしか発生しない奇妙な問題が発生しています。AFNetworking を使用して、2 つの異なるソースから JSON を取得しようとしています。場合によっては、操作の実行中に、アプリが に*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
着陸してクラッシュすることがありjson_request_operation_processing_queue
ます。
これが AFNetworking の問題ではないことを願っています。間違ったことをしているだけです。関連性があると思われるメソッドを次に示します (JSONManager は AFHTTPClient を拡張します)。
+ (JSONManager *) sharedJSONManager {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedJSONManagerInsance = [[JSONManager alloc] initWithBaseURL:[NSURL URLWithString:sourceUrl1]];
});
return _sharedJSONManagerInsance;
}
- (void) loadOperations {
_sharedJSONManagerInsance.operations = [NSMutableArray arrayWithCapacity:2];
[_sharedJSONManagerInsance.operations addObject:[self fetchJSON:sourceUrl1]];
[_sharedJSONManagerInsance.operations addObject:[self fetchJSON:sourceUrl2]];
}
- (void) executeOperations {
[_sharedJSONManagerInsance loadOperations];
_sharedJSONManagerInsance.fetchedStories = [[NSMutableArray alloc] init];
[self enqueueBatchOfHTTPRequestOperations:operations
progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
NSLog(@"Finished %d of %d", numberOfFinishedOperations, totalNumberOfOperations);
}
completionBlock:^(NSArray *operations) {
[[CoreDataManager sharedManager] persistFetchedStories:_sharedJSONManagerInsance.fetchedStories];
_sharedJSONManagerInsance.operations = nil;
NSLog(@"All operations finished");
}];
}
- (AFHTTPRequestOperation *)fetchJSON:(NSString*)requestUrl {
NSURL* jsonUrl = [NSURL URLWithString:requestUrl];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:jsonUrl];
AFJSONRequestOperation *operation = nil;
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
if([requestUrl isEqualToString:sourceUrl1]) {
NSArray* arr = [[JSON valueForKeyPath:@"data"] valueForKey:@"children"];
for (NSDictionary *item in arr) {
FetchedStory* fs = [[FetchedStory alloc] init];
fs.title = [[item valueForKey:@"data"]valueForKey:@"title"];
fs.url = [[item valueForKey:@"data"]valueForKey:@"url"];
fs.score = [[item valueForKey:@"data"]valueForKey:@"score"];
fs.source = @"source1";
[self.fetchedStories addObject:fs];
}
}
else if([requestUrl isEqualToString:sourceUrl2]) {
NSArray* arr = [JSON valueForKeyPath:@"items"];
for (NSDictionary *item in arr) {
FetchedStory* fs = [[FetchedStory alloc] init];
fs.title = [item valueForKey:@"title"];
fs.url = [item valueForKey:@"url"];
NSString* scoreString = [item valueForKey:@"score"];
if(scoreString != nil && [scoreString length]!=0) {
NSRange spaceRange = [scoreString rangeOfString:@" "];
scoreString = [scoreString substringToIndex:spaceRange.location];
fs.score = [NSDecimalNumber decimalNumberWithString:scoreString];
fs.source = @"source2";
[self.fetchedStories addObject:fs];
}
}
}
} failure:nil];
return operation;
}
クラッシュは、「すべての操作が終了しました」というログがコンソールに記録される前に発生します。繰り返しますが、これは時々しか起こりません。