AFNetworking クラスのいくつかのバリアントを試しましたが、これは 1 つの例にすぎませんが、たとえば UIImageView+AFNetworking では、for ループで要求を行うことができず、実際には複数のフレームが返されます。つまり、成功ブロックで最後の応答のみが返される理由がわかりません。他の応答は送信されますが、無期限にハングします。
for (unsigned int i = 1; i <= numFrames; ++i)
{
// Fire a request
NSLog(@"REQUEST MADE FOR FRAME #%u", i);
// get ith frame
NSString* urlString = [NSString stringWithFormat:@"%@%u.png", urlPrefix, i];
NSURL* frameURL = [NSURL URLWithString:urlString];
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:frameURL];
[_myImage setImageWithURLRequest:request
placeholderImage:spinnerImage
success:^(NSURLRequest* request, NSHTTPURLResponse* response, UIImage* image)
{
if (image != nil)
{
NSLog(@"Frame %u DONE!", i);
frames[i - 1] = image;
}
else
{
NSLog(@"Frame #%u is nil, expected %lld bytes!", i, response.expectedContentLength);
}
}
failure:^(NSURLRequest* request, NSHTTPURLResponse* response, NSError* error)
{
NSLog(@"REASON: %@ - %@", error, [error userInfo]);
}];
}
コンソールに表示される出力は
2016-03-06 20:04:45.795 [2625:383915] Reachability Flag Status: -R ------- networkStatusForFlags
2016-03-06 20:04:45.825 [2625:383915] REQUEST MADE FOR FRAME #1
2016-03-06 20:04:45.833 [2625:383915] REQUEST MADE FOR FRAME #2
2016-03-06 20:04:45.834 [2625:383915] REQUEST MADE FOR FRAME #3
2016-03-06 20:04:45.921 [2625:383915] [Crashlytics] Version 3.7.0 (102)
2016-03-06 20:04:46.388 [2625:383915] Reachability Flag Status: -R ------- networkStatusForFlags
2016-03-06 20:04:46.389 [2625:383915] Reachability Flag Status: -R ------- networkStatusForFlags
2016-03-06 20:04:46.389 [2625:383915] Reachability Flag Status: -R ------- networkStatusForFlags
2016-03-06 20:04:46.468 [2625:383915] Frame 3 DONE!
numFrames を 4、10、または 50 などに変更すると、同じことが起こります。フレームごとにリクエストが発行されますが、最後のフレームのみが終了します。他のものは、成功ブロックの nil イメージ、または失敗ブロックのエラーのいずれかを返しません。
私の質問は、私が間違っていることは何ですか? さらに良いことに、一連のフレーム リクエストを作成し (必ずしも連続的または同期的でなくても)、ハングせずにすべてを返すにはどうすればよいでしょうか? ネットワークの到達可能性と実際の URL を確認しましたが、すべて正常です。一度に大量のリクエストを作成し、URL とネットワークへのアクセスがすべて問題なくチェックアウトされたときに、実際にすべてのリクエストから応答を返す方法が必要です。
私はいくつかのことを試しました:
(1)長時間待つ
(2) タイムアウトとエラーのチェック
(3) 2 番目のフレームの要求を最初のフレームの成功ブロックに入れます (2 番目の要求は行われますが、応答がありません)。
(4) AFNetworking の他のバージョン
運がない!
アニメーションをまとめるときの一般的な操作であるため、ネットワークからフレームをプルするには、これよりも優れた API が必要です...