AFNetworking 2.0 完成多张图片下载
Posted
技术标签:
【中文标题】AFNetworking 2.0 完成多张图片下载【英文标题】:AFNetworking 2.0 download multiple images with completion 【发布时间】:2014-05-15 07:22:16 【问题描述】:我正在尝试找出一种使用 AFNewtorking 2.0 下载多个图像的方法。我在SO中阅读了很多帖子,但找不到我正在寻找的答案,希望你们能帮助我。
问题是我想知道所有下载何时完成以及是否所有图像都已下载。 所以我有一个带有图像 URL 的 ant 的数组试图做这样的事情。
for(NSString *photoUrlString in self.photos)
NSURL *url = [NSURL URLWithString:photoUrlString];
AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
requestOperation.responseSerializer = [AFImageResponseSerializer serializer];
[requestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Image error: %@", error);
];
[requestOperation start];
通过将这些请求放入队列并将最大并发操作数设置为 1,我找到了一些答案。但不知道它是如何工作的。
任何帮助表示赞赏,在此先感谢!
【问题讨论】:
您能否发布您使用 afnetworking 2.0 实现的示例以下载多个图像。谢谢! @Yogesh.Lolusare.Apple 检查我的答案,我正在流式传输文件,因为我注意到它更快。如果有人有更好的解决方案,请发布。 【参考方案1】:for(Photo *photo in array)
//form the path where you want to save your downloaded image to
NSString *constPath = [photo imageFullPath];
//url of your photo
NSURL *url = [NSURL URLWithString:photo.serverPath];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];
op.responseSerializer = [AFImageResponseSerializer serializer];
op.outputStream = [NSOutputStream outputStreamToFileAtPath:constPath append:NO];
op.queuePriority = NSOperationQueuePriorityLow;
[op setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead)
];
op.completionBlock = ^
//do whatever you want with the downloaded photo, it is stored in the path you create in constPath
;
[requestArray addObject:op];
NSArray *batches = [AFURLConnectionOperation batchOfRequestOperations:requestArray progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations)
completionBlock:^(NSArray *operations)
//after all operations are completed this block is called
if (successBlock)
successBlock();
];
[[NSOperationQueue mainQueue] addOperations:batches waitUntilFinished:NO];
【讨论】:
谢谢。我会带着我实施的。 您是否需要 AFHTTPRequestOperationManager 来批量加载图像,例如在 tableview 中?【参考方案2】:试试这个:
// _group, _queue are iVar variable
dispatch_group_t *_group = dispatch_group_create();
dispatch_queue_t *_queue = dispatch_queue_create("com.company.myqueue2", NULL);
// all files download
for(int i = 0 ; i < numberOfFileDownloads; i++)
dispatch_group_async(_group, _queue, ^
// here is background thread;
// download file
);
// all files are download successfully, this method is called
dispatch_group_notify(_group, _queue, ^
【讨论】:
【参考方案3】:查看+[AFURLConnectionOperation batchOfRequestOperations:progressBlock:completionBlock:]
尽管没有记录,implementation 是不言自明的。它还允许您监控进度。
在使用此方法之前,您需要有一组 HTTP 操作(如果您决定坚持使用基于 NSURLConnection 的 AFNetworking 实现)。
【讨论】:
以上是关于AFNetworking 2.0 完成多张图片下载的主要内容,如果未能解决你的问题,请参考以下文章
关于最新版AFNetworking(3.0)上传多张图片的问题
ios 上传多张图片总结——IOS网络访问之使用AFNetworking