1
[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”值。这是一个学校作业,所以不要发布正确的代码我只想知道我需要实现的方法或者我如何以我还没有尝试过的方式解决这个问题。提前致谢。

4

2 回答 2

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..."];
                               });
                           }
                       }
 ];
于 2013-10-22T16:14:00.643 回答
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。

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

于 2013-10-22T16:29:36.557 回答