我现在建立了一些解决方法,模仿NSURLConnection的sendAsynchronousRequest
方法。该文件在下面。应该很容易迁移现有的代码,因为块的参数是相同的,只有operationQueue不需要
由类方法分配的对象自己保留,直到请求结束。
的.H
#import <Foundation/Foundation.h>
@interface SNSPApiRequest : NSObject
+(void)startRequest:(NSURLRequest *)request withCompletionHandler:(void (^)(NSURLResponse *, NSData *, NSError *))requestFinished;
@end
的.M
#import "SNSPApiRequest.h"
@interface SNSPApiRequest()
@property NSURLConnection *connection;
@property (strong, nonatomic) void (^requestFinished)(NSURLResponse *response, NSData *responseData, NSError *error);
@property (strong, nonatomic) void (^deconstructSelf)();
@property (strong, nonatomic) NSURLResponse *response;
@property (strong, nonatomic) NSMutableData *data;
@end
@implementation SNSPApiRequest
+(void)startRequest:(NSURLRequest *)request withCompletionHandler:(void (^)(NSURLResponse *, NSData *, NSError *))requestFinished {
SNSPApiRequest *apirequest = [[SNSPApiRequest alloc] init];
apirequest.data = [[NSMutableData alloc] init];
apirequest.requestFinished = requestFinished;
apirequest.deconstructSelf = ^{apirequest.connection = nil;apirequest.response = nil;apirequest.data = nil;};
apirequest.connection = [[NSURLConnection alloc] initWithRequest:request delegate:apirequest];
}
#pragma mark - NSUrlConnectionDataDelegate
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.data appendData:data];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
self.response = response;
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
self.requestFinished(self.response, self.data, nil);
self.deconstructSelf();
self.deconstructSelf = nil;
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
self.requestFinished(self.response, nil, error);
self.deconstructSelf();
self.deconstructSelf = nil;
}
感谢您的输入。虽然,也是一个像completionHandler一样传递的块,它仍然强烈引用其中代码所引用的对象。因为我不需要认证,所以'NSURLConnection sendAsynchronousRequest:queue:completionHandler:'应该也可以,不是吗?但这样做的请求失败。 – TAKeanice
是的,在文档中它也应该是可能的。发生的事情很奇怪。 – Winston
作为解决方法,我制作了自己的自我保留对象来镜像此功能。不过,我很想知道失败背后的原因 – TAKeanice