0

所以我有一些像这样的代码:

@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这样做的最佳方法是什么?

我只是想添加另一个bool将被设置的属性,connectionDidFinishLoading然后循环直到设置该属性。完成后,它将检查self.statusCode. 但是我认为这会阻塞线程不是吗?会和一个权利没有区别sendSynchronousRequest吗?有没有办法在不将其放入后台线程的情况下做到这一点?

4

4 回答 4

1

与其让您的sendRequest:withData:方法返回一个指示成功/失败的 BOOL,不如让您RequestHandler有一个委托。然后,当异步请求完成时,它可以让其委托知道成功/失败/其他任何事情,而不是尝试从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];

您需要在中实现NSURLConnection委托方法RequestHandler(从您的代码中,我假设您已经这样做了),或者,如果您的目标是 iOS 7+,您可以查看一下NSURLSession

于 2014-08-07T10:52:32.773 回答
0

您可以在代码中使用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
    }
}];
于 2014-08-07T12:34:41.987 回答
0

您必须实现 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];
    }
}
于 2014-08-07T10:10:27.443 回答
-1

您还可以通过记录此 returnString 来检查。

        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
        NSArray *arrpicResult = [returnString JSONValue];
于 2014-08-07T10:13:16.520 回答