У меня была эта проблема до 5.0, поэтому я создал небольшой класс для обработки протокола делегата NSURLConnection и предложил вызывающим интерфейсам с замыканиями:
BetterNSURLConnection.h
@property (retain, nonatomic) NSURLRequest *request;
BetterNSURLConnection.m
@property (retain, nonatomic) NSURLConnection *connection;
@property (retain, nonatomic) NSHTTPURLResponse *response;
@property (retain, nonatomic) NSMutableData *responseData;
@property (copy, nonatomic) void (^completionBlock)(id, NSHTTPURLResponse *);
@property (copy, nonatomic) void (^errorBlock)(NSError *);
... Вы можете добавить typedefs, чтобы сделать эти подписи блоков красивее ... затем:
@synthesize connection = _connection;
@synthesize response = _response;
@synthesize responseData = _responseData;
@synthesize completionBlock = _completionBlock;
@synthesize errorBlock = _errorBlock;
@synthesize request=_request;
- (void)startWithCompletion:(void (^)(id, NSHTTPURLResponse *))completionBlock error:(void (^)(NSError *))errorBlock {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
self.completionBlock = completionBlock;
self.errorBlock = errorBlock;
self.responseData = [NSMutableData data];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:self.request delegate:self];
self.connection = connection;
[self.connection start];
[connection release];
}
... тогда сделайте делегата следующим образом:
- (void)connection:(NSURLConnection *)aConnection didReceiveResponse:(NSHTTPURLResponse *)response {
[self.responseData setLength:0];
self.response = response;
}
- (void)connection:(NSURLConnection *)aConnection didReceiveData:(NSData *)data {
[self.responseData appendData:data];
}
- (void)connection:(NSURLConnection *)aConnection didFailWithError:(NSError *)error {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
self.errorBlock(error);
self.connection = nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection {
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
if (self.response.statusCode >= 400) {
self.errorBlock(error);
} else {
// i do json requests, and call a json parser here, but you might want to do something different
id result = [self parseResponse:self.responseData];
self.completionBlock(result, self.response);
}
self.connection = nil;
}