AFNetworking - 除了 for 循环中的最终请求外,没有任何响应
AFNetworking - no response on all but the final request in a for loop
我已经尝试了 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,同样的事情会发生:对每一帧都提出了请求,但只有最后一帧完成。其他的没有 return 任何东西,要么是成功块中的 nil 图像,要么是失败块中的错误。
我的问题是,我做错了什么?或者更好的是,我们可以通过什么方式发出一堆帧请求(甚至不一定是顺序或同步)并且让它们全部 return 而不会挂起?我检查了网络可达性和实际的 URLs,一切正常。必须有一种方法可以同时发出一堆请求,并且当 URL 和网络可访问性都检查正常时,实际上会收到所有请求的回复。
我尝试了一些方法:
(1)久等了
(2) 检查超时和错误
(3) 将第二帧的请求放在第一帧的成功块中(第二个请求已发出,但没有收到回复)
(4) 其他版本的 AFNetworking
运气不好!
必须有比这更好的 API 从网络中拉取帧,因为这是制作动画时的常见操作...
你的代码看起来没问题,试试用这段代码下载图片,我可以在循环中成功使用。这就是我现在可以帮助你的。
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];
使用UIImageView+AFNetworking
时,一个UIImageView
一次只会保留一个请求,之前的请求会被取消,所以只有最后一个请求有效。参考源码见:UIImageView+AFNetworking.m.
可以直接使用AFImageDownloader
API下载多张图片
我已经尝试了 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,同样的事情会发生:对每一帧都提出了请求,但只有最后一帧完成。其他的没有 return 任何东西,要么是成功块中的 nil 图像,要么是失败块中的错误。
我的问题是,我做错了什么?或者更好的是,我们可以通过什么方式发出一堆帧请求(甚至不一定是顺序或同步)并且让它们全部 return 而不会挂起?我检查了网络可达性和实际的 URLs,一切正常。必须有一种方法可以同时发出一堆请求,并且当 URL 和网络可访问性都检查正常时,实际上会收到所有请求的回复。
我尝试了一些方法:
(1)久等了
(2) 检查超时和错误
(3) 将第二帧的请求放在第一帧的成功块中(第二个请求已发出,但没有收到回复)
(4) 其他版本的 AFNetworking
运气不好!
必须有比这更好的 API 从网络中拉取帧,因为这是制作动画时的常见操作...
你的代码看起来没问题,试试用这段代码下载图片,我可以在循环中成功使用。这就是我现在可以帮助你的。
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];
使用UIImageView+AFNetworking
时,一个UIImageView
一次只会保留一个请求,之前的请求会被取消,所以只有最后一个请求有效。参考源码见:UIImageView+AFNetworking.m.
可以直接使用AFImageDownloader
API下载多张图片