簡體   English   中英

NSURLConnection sendAsynchronousRequest:如何檢查完成的狀態碼?

[英]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個委托方法:

  1. 狀態碼 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

  2. 接收到的數據 - (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM