我从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];
}
答案 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];
为什么要使用这个库?
如果您想推出自己的解决方案,可能会帮助您阅读该库的源代码,因为他们已经实现了所有这些。
答案 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...
}