1

我已经搜索了一段时间并尝试了很多东西,但我无法让这个错误消失。我有一个通过下拉方法刷新的表。我还使用 Apple 的可达性来确定互联网连接。当我在互联网上运行我的应用程序,然后在应用程序运行时关闭互联网,我的应用程序在尝试显示 UIAlertView 时崩溃。虽然,当我在没有互联网的情况下启动我的应用程序,然后在应用程序运行时打开互联网并将其关闭时,应用程序不会崩溃并且一切正常。任何帮助将不胜感激。

错误发生在 [message show] 行。

编辑代码:

- (void)loadCallList {

NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];

NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

if (theConnection) {

    NSLog(@"Reachable");

    self.headerHeight = 45.0;

    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
    xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];

        if (elements.count >= 1) {

            TFHppleElement *element = [elements objectAtIndex:0];
            TFHppleElement *child = [element.children objectAtIndex:0];
            NSString *idValue = [child content];

            NSString *idwithxml = [idValue stringByAppendingFormat:@".xml"];
            NSString *url = @"http://www.wccca.com/PITS/xml/fire_data_";
            NSString *finalurl = [url stringByAppendingString:idwithxml];

            xmlParser = [[XMLParser alloc] loadXMLByURL:finalurl];

            [callsTableView reloadData];
        }
    }

else {

    NSLog(@"Not Reachable");

    self.headerHeight = 0.0;

    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"No Internet Connection"
                                                      message:@"Please check your internet connection and pull down to refresh."
                                                     delegate:self
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];
    [message release];
}

[pull finishedLoading];
}
4

2 回答 2

0

你有两个问题:

  1. 您不应该使用可达性来确定是否有互联网连接。可达性仅对确定离线连接何时恢复在线有用。真的。拨打网络电话有时足以启动收音机并连接,因此如果您尝试预先检查是否有互联网连接,收音机将保持关闭状态。

  2. 第二个问题是不能在主线程上进行同步网络调用。这包括可达性和 [NSData dataWithContentsOfURL:xxx]。使用 Grand Central Dispatch、NSOperationQueues、NSURLConnections 或 NSThreads 将它们放在辅助线程上。否则,如果网络状况不佳,您的应用程序可能会锁定,并且系统看门狗计时器会终止您的应用程序。

于 2012-10-03T03:13:38.660 回答
0

我使用 sendAsynchronousRequest:queue:completionHandler: 作为从 URL 下载数据的方法测试了以下方法。它似乎工作正常,我可以通过弄乱 URL 或将超时间隔设置为 0.1 秒来触发 else 子句。

    NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];
    [NSURLConnection sendAsynchronousRequest:theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if (error == nil) {
            //do whatever with the data.  I converted it to a string for testing purposes.
            NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",text);
        }else{
            NSLog(@"%@",error.localizedDescription);
            UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"No Internet Connection" message:@"Please check your internet connection and pull down to refresh." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [message show];
        }
    }];
于 2012-10-03T05:32:01.153 回答