一瞬间TTImageView超时

时间:2012-01-14 17:35:05

标签: ios three20

我有一个带有一堆TTImageViews的TTTableView。图像视图从远程服务器提取图像。我可以在浏览器中查看所有图像。它们都很快加载。

出于某种原因,在尝试加载图像时,大约10%的TTImageViews会超时。问题是,他们的确非常非常快。喜欢一秒钟。当我加载TTTableView时,我立即得到这样的NSErrors(注意:我已经更改了服务器和图像名称):

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x84232f0 {NSErrorFailingURLStringKey=http://www.myserver.com/myimage.jpg, NSErrorFailingURLKey=http://www.myserver.com/myimage.jpg, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x849e640 "The request timed out."}

那么,任何想法为什么TTImageViews偶尔会立即超时?

2 个答案:

答案 0 :(得分:1)

是的!由于网络问题,有时候很奇怪。这是我的解决方案,我让类符合TTImageViewDelegate并在    - (void)imageView:(TTImageView *)imageView didFailLoadWithError:(NSError *)错误 方法,我使用字典来记录它无法加载特定图像的次数。如果失败时间不超过3,那么我调用[imageView reload]强制Three20再次重新请求图像。通常它运作良好,我的意思是有时当它第二次请求时,图像加载成功。如果它连续3次请求失败,那么只是放弃请求该图像,这意味着那时网络是如此糟糕。

#pragma mark TTImageView Delegate

- (void)imageView:(TTImageView*)imageView didLoadImage:(UIImage*)image{
    [failLoadedImagesDict removeObjectForKey:imageView.urlPath];
}

/**
 * Called when the image failed to load asynchronously.
 * If error is nil then the request was cancelled.
 */
- (void)imageView:(TTImageView*)imageView didFailLoadWithError:(NSError*)error{
    NSString *urlPath = imageView.urlPath;
    NSInteger count = [[failLoadedImagesDict valueForKey:urlPath] integerValue];
   if(count > 2) {
    NSLog(@"Fail to load image for 3 times with error: %@", error);
    [failLoadedImagesDict removeObjectForKey:urlPath];
    return;
}
count++;
    [failLoadedImagesDict setObject:[NSNumber numberWithInteger:count] forKey:urlPath];
    [imageView reload];
}

答案 1 :(得分:1)

我不确定这是否与该问题有关,但听起来可能是相关的。

我遇到的问题是,当同一个图像URL发出2次(或更多)同时请求时,图像不会加载到任何请求中。并且错误总是与您报告的相同:

Code=-1001 "The request timed out."

我在方法

的TTRequestLoader.m中找到了
- (void)connectToURL:(NSURL*)URL

如果对同一网址有2个或更多请求,则代码为:

TTURLRequest* request = _requests.count == 1 ? [_requests objectAtIndex:0] : nil;
NSURLRequest* URLRequest = [_queue createNSURLRequest:request URL:URL];

所以请求变量会导致“nil”值,而createNSURLRequest无法设置超时。

将其修改为:

TTURLRequest* request = [_requests lastObject];
NSURLRequest* URLRequest = [_queue createNSURLRequest:request URL:URL];

似乎工作正常

希望这有帮助!