2012-01-14 8 views
0

TTImageViewsにはTTImageViewsの束が含まれています。イメージビューは、リモートサーバーからイメージを取得します。私はすべての画像をブラウザで見ることができます。それらはすべて非常に迅速にロードされます。TTImageViewは分割後にタイムアウトします

何らかの理由で、TTImageViewsの約10%が画像をロードしようとするとタイムアウトします。事は、彼らは本当に、本当に速くタイムアウトします。 1秒以下のように。私は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

https://github.com/facebook/three20/issuesで問題を開くことができますか、そのような問題が既に存在する場合はここを参照してください。 – tonklon

答えて

1

この問題と関連があるかどうかはわかりませんが、それは関連する可能性があります。

私が抱えていた問題は、同じイメージURLへの2つ(またはそれ以上)の同時リクエストが発生したときに、イメージがいずれのリクエストにもロードされないということでした。私はTTRequestLoader.mのメソッドに

- (void)connectToURL:(NSURL*)URL 

は同じURLに2つの以上の要求がある場合、コードがあることを発見した

Code=-1001 "The request timed out." 

:そして、エラーは報告さいつも同じでした:

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]; 

は、このことができますOK

希望を動作するようです!

+0

残念ながら、私が作業していたプロジェクトにアクセスできなくなったため、このソリューションをテストすることはできませんが、これはうまくいくと思います。あなたは正しい、いくつかのURLは同じ画像を指しています。ありがとう! – dnorcott

1

yep!時々ネットワークの問題のために変です。ここで私の解決策は、クラスをTTImageViewDelegateに適合させ、 - (void)imageView:(TTImageView *)imageView didFailLoadWithError:(NSError *)エラー メソッドを使用して、何回失敗したかを記録する辞書を使用します特定のイメージを読み込みます。失敗回数が3回を超えていない場合は、[imageView reload]を呼び出して、Three20にイメージの再要求を強制します。通常は正常に動作しますが、2度目の要求時に画像が正常に読み込まれることがあります。一方、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]; 
} 
+0

ええ、それは私が実装しなければならなかったのと同じトリックです。それはほとんどの場合問題を解決しますが、私は@ alexのソリューションがより包括的だと思います。ありがとう! – dnorcott

関連する問題