![](/img/trans.png)
[英]How to detect if NSURLConnection sendAsynchronousRequest is finished
[英]NSURLConnection sendAsynchronousRequest: How to check finished status code?
所以我有一些這樣的代碼:
@interface RequestHandler()
@property (nonatomic) NSInteger statusCode;
@end
@implementation RequestHandler
- (bool)sendRequest:(NSString *)surveyorId withData:(NSData *)requestData
{
[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:true];
if (self.statusCode == 200)
{
return YES;
}
return NO;
}
顯然,例程將在請求完成之前繼續執行if-else
語句。 因此, self.statusCode
沒有正確委托設置didReceiveResponse
檢查之前。 最好的方法是什么?
我只是想添加將在connectionDidFinishLoading
設置的另一個bool
屬性,然后循環直到設置了該屬性。 完成此操作后,將檢查self.statusCode
。 但是我在想這會阻塞線程嗎? 它與sendSynchronousRequest
沒什么不同,對嗎? 有沒有辦法將其放入后台線程?
代替您的sendRequest:withData:
方法返回指示成功/失敗的BOOL的方法,最好讓RequestHandler
擁有一個委托。 然后,它可以讓其委托人知道成功/失敗/異步請求完成后的所有其他信息,而不是嘗試從sendRequest:withData:
方法返回此信息(如您sendRequest:withData:
,該方法不起作用)很好)。
因此,您可以定義類似這樣的委托協議(僅作為示例-您可能希望在其中包含更多信息):
@protocol RequestHandlerDelegate <NSObject>
- (void)requestHandlerSuccessfullyCompletedRequest:(RequestHandler *)sender;
- (void)requestHandlerFailedToCompletedRequest:(RequestHandler *)sender;
@end
然后,為您的RequestHandler提供一個符合此協議的委托屬性:
@property (nonatomic, weak) id<RequestHandlerDelegate> delegate;
(確保您將某些內容設置為委托人!)
然后,當您的異步請求完成時,可以向您的委托發送適當的消息,例如:
[self.delegate requestHandlerSuccessfullyCompletedRequest:self];
您將需要在RequestHandler
實現NSURLConnection
委托方法(從您的代碼中,我認為您已經完成了),或者,如果您的目標是iOS 7+,則可以NSURLSession
。
您必須實現2個委托方法:
狀態碼 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
接收到的數據 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
用法示例:
宣言
@interface RequestHandler : NSObject <NSURLConnectionDelegate>
{
NSMutableData *receivedData;
}
請求
- (void)sendRequest:(NSString *)surveyorId withData:(NSData *)requestData
{
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
// Apply params in http body
if (requestData) {
[request setHTTPBody:requestData];
}
[request setURL:url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
代表們
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *responseCode = (NSHTTPURLResponse *)response;
if ([self.delegate respondsToSelector:@selector(didReceiveResponseCode:)]) {
[self.delegate didReceiveResponseCode:responseCode];
}
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
receivedData = [[NSMutableData alloc] initWithData:data];
if ([self.delegate respondsToSelector:@selector(connectionSucceedWithData:)]) {
[self.delegate connectionSucceedWithData:receivedData];
}
}
可以在代碼中使用NSURLConnection sendAsynchronousRequest
塊,而不是將NSURLConnection與委托方法一起使用。 在示例中,您可以檢查連接錯誤並比較狀態代碼。
NSURL *URL = [NSURL URLWithString:@"http://yourURLHere.com"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:URL];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rspreportStatus, NSData *datareportStatus, NSError *e)
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)rspreportStatus;
int code = [httpResponse statusCode];
if (e == nil && code == 200)
{
// SUCCESS
} else {
// NOT SUCCESS
}
}];
您也可以通過記錄此returnString進行檢查。
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
NSArray *arrpicResult = [returnString JSONValue];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.