Тайм-аут TTImageView после доли секунды - PullRequest
0 голосов
/ 14 января 2012

У меня есть TTTableView с кучей TTImageViews в нем.Изображения обращают свои изображения с удаленного сервера.Я могу просматривать все изображения в браузере просто отлично.Все они загружаются очень быстро.

По некоторым причинам, около 10% времени ожидания TTImageViews при попытке загрузить изображение.Дело в том, что они истекают очень, очень быстро.Как под секунду.Когда я загружаю TTTableView, я сразу получаю следующие ошибки NSE (примечание: я изменил имя сервера и изображения):

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 ]

1 голос
/ 24 апреля 2012

Я не уверен, что это как-то связано с этой проблемой, но, похоже, это может быть связано.

Проблема, с которой я столкнулся, заключалась в том, что при одновременном выполнении 2 (или более) запросов на один и тот же URL-адрес изображения изображения не загружались ни в один из запросов. И ошибка всегда была той же, о которой вы сообщили:

Code=-1001 "The request timed out."

Я обнаружил, что в TTRequestLoader.m по методу

- (void)connectToURL:(NSURL*)URL

когда есть 2 или более запросов на один и тот же URL, код:

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

Итак, переменная request приводит к значению "nil", а createNSURLRequest не может установить время ожидания.

Изменение его на:

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

Кажется, работает ОК

Надеюсь, это поможет!

1 голос
/ 16 марта 2012

да! иногда это странно из-за проблем с сетью. Вот мое решение, я позволил классу соответствовать 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];
}
...