如何异步下载1000张图片?

时间:2012-02-06 19:56:58

标签: iphone objective-c

我从URL下载了大约1000张图像到iPhone文件系统,但我想异步进行。目前我正在使用此代码:

-(void)saveImageInFile:(NSString *)imageName image:(UIImage *)img{

    // add the images in the file
    NSData *tmpData;

    if ([self.constImageType isEqualToString:@"png"]) {
        tmpData = UIImagePNGRepresentation (img);
    }

    else if ([self.constImageType isEqualToString:@"jpg"]) {
        tmpData = UIImageJPEGRepresentation(img, 0.7f);
    }

    NSString *path = [self.documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName,self.constImageType]];
    //NSLog(path);
    [tmpData writeToFile:path atomically:YES];

}

3 个答案:

答案 0 :(得分:1)

我正在做类似于1000以上的图像。我正在为核心数据中的图像存储url,然后获取记录属性NSArray的所有记录的imageDownloaded = NO。在下载图像时,我设置了该记录的imageDownloaded = YES,因此如果应用需要重新启动,它可以从中断处继续。

以下是发生什么事的一个小例子。我正在使用Grand Central Dispatch来处理这个过程,所以我没有阻止主线程。

__block NSArray *records; //...get records

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0];

        for (NSManagedObject *obj in records) {
            NSString *imageName = [obj valueForKey:@"filename"];

            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",[obj valueForKey:@"remote_path"],imageName]];
            NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
            NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL];
            [responseData writeToFile:[NSString stringWithFormat:@"%@/%@",documentsDirectory,imageName] atomically:NO];
            [obj setValue:[NSNumber numberWithBool:YES] forKey:@"imageDownloaded"];
        }
    });

有关Grand Central Dispatch的更多信息 https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

答案 1 :(得分:1)

我建议您下载https://github.com/ZarraStudios/ZDS_Shared并执行

// queue download
[[ZSAssetManager singleton] queueAssetForRetrievalFromURL:url]; 

// recover the download from the file system
UIImage *imagen = [[ZSAssetManager singleton] imageForURL:url];

为什么要使用这个库?

  • 根据可用带宽和网络限制/暂停/恢复下载 状态。请注意,它使用可以挂起的NSOperationQueue(与块不同)。
  • 它处理从URL的哈希生成文件名以避免冲突。
  • 在应用程序启动时,它会将已缓存的文件列表读入内存。
  • 当应用程序进入后台时,它可选地允许缓存。
  • 您可以设置文件的到期日期(或没有到期日期。)
  • 如果应用程序收到内存警告,则会刷新内存缓存,因为您正在从缓存中快速读取UIImages。
  • 易于使用(仅限上述两行)。

如果您想推出自己的解决方案,可能会帮助您阅读该库的源代码,因为他们已经实现了所有这些。

答案 2 :(得分:0)

了解Grand Central Dispatch (GCD)

获取其中一个默认队列,并使用块将代码放入该队列。如果您不熟悉块Blocks Programming Topic

这是一个简短的例子:

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_async(queue, ^{
// This is a BLOCK. Put code here to download images in background...
}