我現在建立了一些解決方法,模仿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