简单的解决方案是异步执行此操作,随时更新进度视图:
- 创建进度视图并将其添加到您的视图中 
- 将您的代码分派到后台队列 
- 每次下载完成后,将进度视图的更新分派回主队列 
在伪代码中,这看起来像
UIProgressView *progressView = [[UIProgressView alloc] init];
// configure the progress view and add it to your UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    for (int i=0; i<[array count]; i++)
    {
        NSError *error;
        NSArray *ipaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *idocumentsDir = [ipaths objectAtIndex:0];
        NSString *idataPath = [idocumentsDir stringByAppendingPathComponent:@"File"];
        NSLog(@"idataPath:%@",idataPath);
        //Create folder here
        if (![[NSFileManager defaultManager] fileExistsAtPath:idataPath])
        {
            [[NSFileManager defaultManager] createDirectoryAtPath:idataPath withIntermediateDirectories:NO attributes:nil error:&error];
        }
        // Image Download here
        NSString *fileName = [idataPath stringByAppendingFormat:@".jpg"];
        NSLog(@"imagePathDOWNLOAD:%@",fileName);
        _imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[array objectAtIndex:i]]];
        [_imgData writeToFile:fileName atomically:YES];
        // now dispatch any UI updates back to the main queue
        dispatch_async(dispatch_get_main_queue(), ^{
            [progressView setProgress: (CGFloat) (i + 1.0) / [array count] animated:YES];
            tempImg.image = [UIImage imageWithData:_imgData];
        });
    }
});
还有一系列越来越优雅的方法:
- 使用并发队列(而不是上面的,串行下载图像)来下载图像,这将明显更快。- maxConcurrentCount我可能会建议使用of 的操作队列- 5来享受并发,但请确保您的并发请求数不超过 iOS 限制。
 
- 使用- NSURLConnectionDataDelegate基于下载而不是- NSData方法- initWithContentsOfURL,它可以在单个下载期间提供临时进度。有关示例,请参见下载管理器或下载操作。
 
- 使用AFNetworking,它还提供基于下载进度块的界面。 
上面,在第 1 点中,我建议您考虑使用并发队列,因此我决定对其进行基准测试。对我来说,下面的这个 GCD 实现比它后面的实现慢 3-4 倍NSOperationQueue。
这是 GCD 的实现:
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
UIProgressView *progressView = [self addProgressView];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSInteger downloadSuccessCount = 0;
    NSInteger downloadFailureCount = 0;
    NSString *idataPath = [self createDownloadPath];
    for (int i = 0; i < [array count]; i++)
    {
        // Image Download here
        NSString *filename = [self pathForItem:i array:array folder:idataPath];
        NSURL *url = [self urlForItem:i array:array];
        NSData *data = [[NSData alloc] initWithContentsOfURL:url];
        UIImage *image = nil;
        if (data)
            image = [UIImage imageWithData:data];
        if (image) {
            downloadSuccessCount++;
            [data writeToFile:filename atomically:YES];
        } else {
            downloadFailureCount++;
        }
        // now dispatch any UI updates back to the main queue
        dispatch_async(dispatch_get_main_queue(), ^{
            [progressView setProgress: (CGFloat) (downloadSuccessCount + downloadFailureCount) / [array count] animated:YES];
            // update the image in the UI if you want
            [UIView transitionWithView:self.imageView duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                tempImg.image = image;
            } completion:nil];
        });
    }
    NSLog(@"Completed in %.1f seconds", CFAbsoluteTimeGetCurrent() - start);
});
对此NSOperationQueue实施:
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
UIProgressView *progressView = [self addProgressView];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 5;
NSString *idataPath = [self createDownloadPath];
self.downloadSuccessCount = 0;
self.downloadFailureCount = 0;
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Completed in %.1f seconds", CFAbsoluteTimeGetCurrent() - start);
}];
for (int i = 0; i < [array count]; i++)
{
    NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        // Image Download here
        NSString *filename = [self pathForItem:i array:array folder:idataPath];
        NSURL *url = [self urlForItem:i array:array];
        NSData *data = [NSData dataWithContentsOfURL:url];
        UIImage *image = nil;
        if (data)
            image = [UIImage imageWithData:data];
        if (image)
            [data writeToFile:filename atomically:YES];
        // now dispatch any UI updates back to the main queue
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            if (image) {
                self.downloadSuccessCount++;
                // update the image in the UI if you want, though this slows it down
                [UIView transitionWithView:self.imageView duration:0.25 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
                    tempImg.image = image;
                } completion:nil];
            }
            else
                self.downloadFailureCount++;
            [progressView setProgress: (CGFloat) (self.downloadSuccessCount + self.downloadFailureCount) / [array count] animated:YES];
        }];
    }];
    [queue addOperation:operation];
    [completionOperation addDependency:operation];
}
[queue addOperation:completionOperation];
底线,如果您使用NSOperationQueue(它不仅提供并发,您也可以在 GCD 并发队列中执行此操作,而且还可以让您轻松控制并发操作的数量(对于网络操作,您应该限制为五个或更少)) ,您将享受到显着的性能优势。
正如我所建议的,更好的是使用 AFNetworking,您不仅可以享受这种操作队列并发的好处,还可以享受其他好处。