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 快速上传多张图片

使用 AFNetworking 上传多张图片

关于最新版AFNetworking(3.0)上传多张图片的问题

ios 上传多张图片总结——IOS网络访问之使用AFNetworking

ios 上传多张图片总结——IOS网络访问之使用AFNetworking

AFNetworking 2.0,使用 NSURLSession 下载图片