在Objective-C中重试URL请求的可接受方法?

时间:2010-08-12 03:24:37

标签: objective-c cocoa nsstring nsurlrequest

我有一个连接请求正在使用来自NSString的stringWithContentsOfURL:encoding:error:方法。我希望能够在第一次失败时重试连接。我打算重写函数以使用NSURLRequest的超时功能,但我想我真的想在失败之前使用多次重试。

除了做一些粗略的事情,比如计数器循环,在Objective-C中是否有一种可接受的方式来重试数据的URL请求?

编辑: 好的,我实现了NSURLConnection来获取我感兴趣的数据,并使用NSError为错误添加了一些基本的处理。以下是我最初的尝试:

- (id)initWithURL:(NSURL*)aURL {
    NSError     *error      = nil;
    NSURLResponse   *response   = nil;

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:aURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20];

    NSData *data = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&error];

    NSString *xmlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    if (response == nil) {
        if (error) {
            NSLog(@"Error has occurred: %@", [error localizedDescription]);
        }
    }
}

注意:我还没有实现优雅失败的策略,我现在只记录错误。

使用此代码(或任何建议的改进),在这里实施重试策略的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

请勿使用+stringWithContentsOfURL:。使用适当的NSURLConnection。它会告诉你加载失败的原因。

答案 1 :(得分:0)

我认为反制方法并不是那么糟糕。只要这个函数调用不在主面包上,阻止UI,那么你可能没有其他的东西可以做。保持计数器要重试的次数,然后在if块中重试并增加计数器。