NSURLConnection と NSJSONSerialization は正常に動作します。
編集: 簡潔にするために編集された、私のプロジェクトの 1 つからのサンプル コード。
fstr(...) は、[NSString stringWithFormat:...] の単なるラッパーです。
このコードは、GCD を使用してバックグラウンド スレッドで呼び出します。スレッドセーフではありません。
- (NSMutableURLRequest *)buildGetRequestHeaderWithMethod:(NSString *)method
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]
initWithURL:[NSURL URLWithString:fstr(@"%@%@", self.url, method)]];
[request setTimeoutInterval:10.0];
[request setHTTPMethod:@"GET"];
[request setValue:self.key forHTTPHeaderField:@"Authentication"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
return request;
}
- (id)callMethod:(NSString *)method
{
NSMutableURLRequest *request = [self buildGetRequestHeaderWithMethod:method];
return [self sendRequest:request withMethod:method];
}
- (id)sendRequest:(NSMutableURLRequest *)request withMethod:(NSString *)method
{
NSHTTPURLResponse *response = nil;
NSError *error = nil;
[state() pushNetworkActivity];
NSData *result = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:&error];
[state() popNetworkActivity];
self.lastStatusCode = response.statusCode;
// Bug in Cocoa. 401 status results in 0 status and NSError code -1012.
if(error && [error code] == NSURLErrorUserCancelledAuthentication)
{
[self interpretHTTPError:401 URLError:error forMethod:method];
self.lastStatusCode = 401;
return nil;
}
if(response.statusCode != 200)
{
[self interpretHTTPError:response.statusCode URLError:error forMethod:method];
return nil;
}
id jsonResult = [self parseJsonResult:result];
debug(@"%@", jsonResult);
return jsonResult;
}
- (void)interpretHTTPError:(int)statusCode URLError:(NSError *)urlError
forMethod:(NSString *)method
{
NSString *message = fstr(@"HTTP status: %d", statusCode);
if(statusCode == 0)
message = [urlError localizedDescription];
#ifdef DEBUG
message = fstr(@"%@ (%@)", message, method);
#endif
if(self.alertUserOfErrors)
{
dispatch_async(dispatch_get_main_queue(), ^{
errorMessage (message);
});
}
else
debug(@"%@", message);
self.lastErrorMessage = message;
}
- (id)parseJsonResult:(NSData *)result
{
if( ! result)
return nil;
NSError *error = nil;
id jsonResponse = [NSJSONSerialization JSONObjectWithData:result
options:NSJSONReadingMutableContainers error:&error];
if(error)
{
NSLog(@"JSONObjectWithData failed with error: %@\n", error);
return nil;
}
return jsonResponse;
}