【问题标题】:How to check a timeout occurred in ios url connection?如何检查ios url连接中发生的超时?
【发布时间】:2015-06-01 07:43:14
【问题描述】:

我使用 URLRequest 从我的 wifi 网络中的电脑获取 html 文件。 我的应用程序从我的文件服务器获取一个 html 文件,文件名是在应用程序中输入的数字。我还为请求设置了 20 秒的超时时间。我如何检测是否发生超时,因为我有两种情况, 1.文件不存在 2. 连接慢

在 urlrequest 中,有一个 BOOL 表示错误,没有描述。 如果可能的话给我一个方法。 我的代码在下面仅用于 urlrequest

-(void)getHtmlContent{
[self.spinner startAnimating];
NSString *str = @"http://192.168.1.250/rec/";
//        NSString *str = @"file:///Volumes/xampp/htdocs/";
str = [str stringByAppendingString:numEntered.text];
str = [str stringByAppendingString:@".html"];
NSURL *url=[NSURL URLWithString:str];
//self.htmlContent = nil;

NSMutableURLRequest *request = [NSMutableURLRequest             requestWithURL:url];
    //NSURLRequest *request = [NSURLRequest requestWithURL:url];
    request.timeoutInterval = 20.0;
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
    NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *localfile, NSURLResponse *response, NSError *error) {
        if(!error){
            if([request.URL isEqual:url]){

                NSString *content = [NSString stringWithContentsOfURL:localfile encoding: NSUTF8StringEncoding error:&error];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [numEntered setText:@"0"];
                    text = @"";
                    [self.spinner stopAnimating];

                    self.htmlContent = content;

                    NSString *myHTMLString = self.htmlContent;
                    if(myHTMLString != nil) {
                        if([myHTMLString isEqualToString:@"3"]){
                            UIAlertView *alrt = [[UIAlertView alloc] initWithTitle:@"LogIn Success" message:@"" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles:nil];
                            self.view.userInteractionEnabled = YES;
                            [alrt show];


                        }
                        else{
                            UIAlertView *alrt = [[UIAlertView alloc] initWithTitle:@"LogIn Failed. Try again." message:@"User not authenticated" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                            self.view.userInteractionEnabled = YES;
                            [alrt show];
                        }
                    }

                });

            }
        }
        else {
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.spinner stopAnimating];
                [numEntered setText:@"0"];
                text = @"";
                UIAlertView *alrt = [[UIAlertView alloc]   initWithTitle:@"Requested file does not exist." message:@"Try again." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                self.view.userInteractionEnabled = YES;
                [alrt show];
            });
        }
    }];
    [task resume];



}

【问题讨论】:

  • 查看错误描述并查看此link

标签: ios xcode timeout detect urlrequest


【解决方案1】:

由于我无法发表评论,因此我将其写为答案。

您需要检查错误对象以查看发生的错误类型。

所以在您的 else 块中,您需要检查 error.localizedDescription 以查看发生了什么,它通常会告诉您文件未找到或请求是否超时。你甚至可以使用你的警报来显示它,就像改变你的 else 块一样

else {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.spinner stopAnimating];
            [numEntered setText:@"0"];
            text = @"";
            UIAlertView *alrt = [[UIAlertView alloc] initWithTitle : @"Error"                                                                  
                                                           message : error.localizedDescription 
                                                          delegate : self 
                                                 cancelButtonTitle : @"Ok" 
                                                 otherButtonTitles : nil];
            self.view.userInteractionEnabled = YES;
            [alrt show];
        });
    }

【讨论】:

  • 谢谢。 error.localizedDescription 足以让我解决问题
【解决方案2】:

你必须使用这个delegate方法来处理超时:-

-(void) connection:(NSURLConnection * ) connection didFailWithError:(NSError *)error {    
    if (error.code == NSURLErrorTimedOut) 
        // handle error as you want 
        NSLog(@"Request time out");
}

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2020-10-10
    • 2018-10-30
    • 2014-07-21
    相关资源
    最近更新 更多