如何验证NSURLConnection是否成功

时间:2013-10-22 15:48:11

标签: objective-c nsurlconnection

[NSURLConnection sendAsynchronousRequest:mutURLRequest queue:opQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {

     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
     if(httpResponse.statusCode ==200)
     {
         [[NSNotificationCenter defaultCenter] postNotificationName:@"MUITCheckinPostSucceeded" object:self userInfo:postDictionary];
     }
 }];

这是我的NSURLConnection,我不知道如何检查它是否成功。我尝试了一个简单的标志但是没有用,因为布尔值没有在NSURLConnection之外保留“YES”值。这是一个学校作业,所以不要发布正确的代码,我只想知道我需要实现的方法,或者我如何以一种我尚未尝试过的方式解决这个问题。提前致谢。

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

[NSURLConnection sendAsynchronousRequest: myURLRequest 
                                   queue: [NSOperationQueue mainQueue]
                       completionHandler: ^(NSURLResponse *urlResponse, NSData *responseData, NSError *requestError) {
                           // Check for Errors
                           if (requestError || !responseData) {
                               // jump back to the main thread to update the UI
                               dispatch_async(dispatch_get_main_queue(), ^{
                                 [myLabel setText: @"Something went wrong..."];
                               });
                           } else {
                               // jump back to the main thread to update the UI
                               dispatch_async(dispatch_get_main_queue(), ^{
                                 [myLabel setText: @"All going well..."];
                               });
                           }
                       }
 ];

答案 1 :(得分:0)

您可以从完成块更新类属性。在这种情况下,如果flag是原子的,您可以更新它。但是,如果您正在设置其他任何内容(例如,从生成的data对象更新任何对象属性),您可能希望将其分发回主队列以避免同步问题:

self.flag = NO;

[NSURLConnection sendAsynchronousRequest:mutURLRequest queue:opQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
 {
     NSInteger statusCode = -1;

     // to be safe, you should make sure `response` is `NSHTTPURLResponse`

     if ([response isKindOfClass:[NSHTTPURLResponse class]])
     {
         NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
         statusCode = httpResponse.statusCode;
     }

     if (error)
     {
         // for diagnostic purposes only
         NSLog(@"%s: sendAsynchronousRequest error: %@", __FUNCTION__, error);
     }

     if (error == nil && statusCode == 200)
     {
         [[NSOperationQueue mainQueue] addOperationWithBlock:^{
             self.flag = YES;

             // set any other class properties here

             [[NSNotificationCenter defaultCenter] postNotificationName:@"MUITCheckinPostSucceeded" object:self userInfo:postDictionary];
         }];
     }
 }];

我注意到您发布了通知。如果您有多个视图控制器或模型对象正在侦听该通知,那很好,通知也很有意义。但是如果这个代码在视图控制器中并且该控制器是唯一关心结果的东西,那么通常会放弃通知,只是从发送回完成块中的主队列的代码开始更新UI。

最后一个警告。对self(或ivars,隐含引用self)的任何引用都将在操作期间保持对对象的强引用(即它将保留它)。例如,如果在网络操作正在进行时关闭视图控制器,则在网络操作完成之前,视图控制器才会被释放。这通常很好(因为它只是在连接的持续时间......这不是可怕的强参考周期),特别是对于学校作业。但是如果这是一个问题,那么有些技术只能在完成块内使用对视图控制器的弱引用,从而阻止在网络操作期间保留视图控制器。但这超出了原始问题的范围(特别是因为它导致了一些关于是否要取消网络操作的其他问题,当你关闭视图控制器时),所以我将把它留在这里。 / p>