我有一个带有一堆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偶尔会立即超时?
答案 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];
似乎工作正常
希望这有帮助!