Objective c 如何验证NSURLConnection是否成功

Objective c 如何验证NSURLConnection是否成功,objective-c,nsurlconnection,Objective C,Nsurlconnection,这是我的NSURL连接,我不知道如何检查它是否成功。我尝试了一个简单的标志,但没有成功,因为布尔值在NSURLConnection之外没有保留“YES”值。这是一个学校作业,所以不要发布正确的代码。我只是想知道我需要实现的方法,或者我如何以我还没有尝试过的方式解决这个问题。提前谢谢 试试这样的方法: [NSURLConnection sendAsynchronousRequest:mutURLRequest queue:opQueue completionHandler:^(NSURLRespo

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

试试这样的方法:

[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 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..."];
                               });
                           }
                       }
 ];
我注意到您正在发布通知。如果有多个视图控制器或模型对象侦听该通知,则这很好,并且通知是有意义的。但是,如果该代码在视图控制器中,并且该控制器是唯一关心结果的东西,那么您通常会放弃通知,直接从发送回该完成块中的主队列的代码启动更新UI


最后一个警告。任何对
self
(或IVAR,其具有对
self
的隐式引用)的引用将在操作期间保持对对象的强引用(即,它将保留它)。例如,如果在网络操作进行时关闭视图控制器,则在网络操作完成之前不会释放视图控制器。这通常是好的(因为这只是为了连接的持续时间…这不是可怕的强参考周期),尤其是对于学校作业。但是,如果这是一个问题,则有一些技术仅在完成块内使用对视图控制器的弱引用,从而防止在网络操作期间保留视图控制器。但这超出了您最初问题的范围(特别是因为当您关闭视图控制器时,它会导致一系列关于是否要取消网络操作的其他问题),因此我将把它留在这里。

检查
NSError
值和
statusCode
是正确的方法。也许您可以扩展代码示例,向我们展示如何使用此布尔值,我们可以进一步帮助您。如果没有这一点,很难对布尔值的行为进行评论,而不了解您是如何使用它的;我只是在NSNotificationCenter上面的if语句中有“self.flag=YES;”,我删除了它,因为我不确定如果它封装在我的NSURLConnection中,是否可以保留该标志的值。如果连接不成功,NSError的值是多少。是的,您可以在该完成块内更新视图控制器的属性,而不会发生意外事件(不过,在许多情况下,您希望将这些更新发回主队列时,请小心更新
opQueue
…中的变量)“n错误*错误“如果失败了会怎么样?这将非常有效,但我需要在视图中显示消息controller@user2904379然后将NSLog更改为Label我已经更新了示例,根据操作结果更新了UILabel。dispatch块可能有些过分,但根据代码的执行位置,这是确保UI更新在主线程上进行的安全方法。顺便说一句,我不会放弃检查响应的
statusCode
,因为有一些类型的服务器端错误会返回
响应数据
,并且不会导致
请求错误
(例如,URL中的键入导致404页未找到错误)。这主意不错,Rob。这将提供完整的覆盖范围。当它退出此代码块时,我仍然得到一个假值。@user290439您可能在该代码块之后立即进行检查。但此网络请求是异步发生的,因此
标志将在稍后网络请求完成时设置(可能在几秒钟后)。在完成块中添加一个
NSLog
,您就会明白我的意思。但是不要尝试使用
sendSynchronousRequest
,因为您永远不应该在主队列上执行同步网络请求。那么这是否意味着我需要提出一个不同的解决方案,而不是一个标志,因为我需要返回这个值,并且我的if语句位于不同的队列中class@user2904379这只是时间问题。这只是意味着您在完成块(或在响应通知而触发的代码中)内执行所有检查,而不是在启动请求后立即执行的代码中。
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];
         }];
     }
 }];