AFNetworking 2.0下载完成后的多个图像

时间:2014-05-15 07:22:17

标签: ios objective-c afnetworking afnetworking-2

我试图找出一种使用AFNewtorking 2.0下载多张图像的方法。我已经在这里阅读了很多帖子,但找不到我想要的答案,希望你们能帮助我。

问题是我想知道所有下载完成后以及所有下载的图像。 所以我有一个带有图像URL的数组,试图做这样的事情。

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.但不知道它是如何工作的。

感谢任何帮助,提前谢谢!

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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, ^{
}

答案 2 :(得分:1)

查看+[AFURLConnectionOperation batchOfRequestOperations:progressBlock:completionBlock:]

虽然没有记录,implementation是不言自明的。它还允许您监控进度。

在使用此方法之前,您需要拥有一系列HTTP操作(如果您决定坚持使用基于NSURLConnection的AFNetworking实现)。