0

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 が必要です...

4

2 に答える 2

2

あなたのコードは問題ないようです。このコードを使用して画像をダウンロードしてみてください。ループで正常に使用できます。それが私が今あなたを助けることができるものです。

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];

requestOperation.responseSerializer = [AFImageResponseSerializer serializer];

[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    [imageView setImage: responseObject];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Image error: %@", error);
}];
[requestOperation start];
于 2016-03-07T04:39:12.233 に答える
1

を使用するUIImageView+AFNetworkingと、一度に 1 つUIImageViewのリクエストのみが保持され、以前のリクエストはキャンセルされるため、最後のリクエストのみが機能します。参照用のソース コードを参照してください: UIImageView+AFNetworking.m

AFImageDownloaderAPI を直接使用して、複数の画像をダウンロードできます。

于 2016-03-15T09:59:09.873 に答える