AFNetworking - 除了 for 循环中的最终请求外,其他所有请求均无响应

Posted

技术标签:

【中文标题】AFNetworking - 除了 for 循环中的最终请求外,其他所有请求均无响应【英文标题】:AFNetworking - no response on all but the final request in a for loop 【发布时间】:2016-03-07 04:18:06 【问题描述】:

我已经尝试了 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 之类的值,则会发生同样的事情:为每一帧放置一个请求,但只有最后一个完成。其他的不返回任何东西,要么是成功块中的零图像,要么是失败块中的错误。

我的问题是,我做错了什么?或者更好的是,我们可以通过什么方式发出一堆帧请求(甚至不一定是顺序或同步的)并让它们全部返回而不挂起?我检查了网络可达性和实际 URL,那里一切正常。必须有一种方法可以一次发出一堆请求,并在 URL 和网络可访问性都检查正常时真正收到所有请求的回复。

我尝试了一些方法:

(1) 等了很久

(2) 检查超时和错误

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

(4) 其他版本的 AFNetworking

没有运气!

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

【问题讨论】:

【参考方案1】:

您的代码看起来不错,尝试使用此代码下载图像,我能够成功使用循环。这就是我现在可以帮助你的。

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

【讨论】:

我在 AFNetworking 3.x 中没有找到这个 API。我看到的最接近的接口是 AFHTTPSessionManager,它不允许我访问 AFHTTPRequestOperation。您能否粘贴您的整个文件,或者至少粘贴运行它所需的导入和输入?谢谢。 我已经在 bitbucket 上创建了 AFHTTPSessionManager 文件的 sn-p,您可以从 bitbucket.org/snippets/bharatmodi777/8rA5M 获得它,我刚刚将一个文件导入为 #import "AFNetworking.h",仅此而已。如果还有其他需要,请告诉我。【参考方案2】:

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

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

【讨论】:

以上是关于AFNetworking - 除了 for 循环中的最终请求外,其他所有请求均无响应的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 后台上传大量图片

在 for 循环中传递数据时,MagicalRecord 正在保存 null

AFNetworking/NSURLSession耗时长创建100多个任务下载文件

从字节码看Java中for-each循环(增强for循环)实现原理

JAVA。我嵌套的for循环,我从另一个数组插入数组中的整数跳过整个部分,除了第一个和最后一个值

Python for循环