AFNetworking - 除了for循环中的最终请求之外的所有请求都没有响应

时间:2016-03-07 04:18:06

标签: ios networking afnetworking afnetworking-2 afnetworking-3

我已经尝试了几种AFNetworking类的变种,这只是一个例子,但是在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和网络可访问性都检查好时,实际上会收到所有请求的回复。

我尝试了一些事情:

(1)等待很长时间

(2)检查超时和错误

(3)将第二帧的请求放在第一帧的成功块中(第二个请求被发出,但没有收到回复)

(4)其他版本的AFNetworking

没有运气!

从网络中提取帧数必须有比这更好的API,因为在组合动画时这是一个常见的操作...

2 个答案:

答案 0 :(得分:2)

您的代码看起来很好,尝试使用此代码下载图像,我可以成功使用in循环。这就是我现在可以帮助你的东西。

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

答案 1 :(得分:1)

使用UIImageView+AFNetworking时,一个UIImageView一次只会保留一个请求,之前的请求将被取消,因此只有最后一个请求有效。请参阅源代码以供参考:UIImageView+AFNetworking.m

您可以直接使用AFImageDownloader API下载多张图片。