iOS 下载大量图片,最佳解决方案
iOS downloading a lot of images, best possible solution
前段时间我发布了这个问题:
Cordova / Phonegap downloading a lot of images, best possible solution
但是没有人真正回答这个问题。
我决定做同样的申请,但现在 Objective C。
但我仍然有同样的问题:)
所以,我有 iOS 使用 Objective C 和 XCode 开发的应用程序。
这个应用程序应该可以离线和在线工作。
如果用户是第一次启动应用程序,他会看到进度条,所有数据和图像都已获取并下载到他的设备上。
在该进程应用重新加载(重新开始)之后
可以,但是我觉得app第一次启动太慢了(800多张图片)需要7多分钟,这对用户体验来说真的很糟糕。
以下是我的一些策略:
将所有图像下载为单个 ZIP 文件并将其解压缩到设备中
只下载部分图像(25%?),然后在后台下载其余部分,同时用户可以使用他的应用程序。在某些地方使用某种图像占位符?
哪种策略最好?也许有人有类似的经历?
步骤:1
我建议你不要第一次下载图片。只需提取所需的数据并输入数据库或您正在使用的任何技术,然后让使用进入应用程序。这几乎不需要几秒钟。
步骤:2
只下载当前需要展示的图片。记住不要在主线程上下载图像。下载后将它们保存在本地文件夹中。这样您就不需要再次下载相同的图像。由于您的应用程序支持离线模式,因此如果图像未提前下载,您可以使用占位符图像。
设置:3
在开始下载图片之前,请先检查它是否存在于您的本地文件夹中。
要下载图片你可以通过下面的link.
您应该只在要显示图像时才下载图像。我认为最简单的方法是使用 https://github.com/rs/SDWebImage。它将为您加载图像、缓存它,并在需要时清除缓存。
你已经得到了一些很好的答案。
而且你一开始只下载其中一些的想法也很好。
我建议您使用混合方法。
当应用程序启动时,您检查您有哪些图像并开始在低优先级的后台线程上下载其余图像,以便应用程序正常运行。
你也正常打开应用程序,每次你需要显示图像时,你检查你是否有它,如果没有,你马上下载。只拿到一个应该很快。
您没有向我们提供有关您的应用的太多详细信息,但您也可以将应用中的所有图像捆绑在一起(如果它们根本不发生变化)。并且对应用程序有一个很好的描述,这样用户就会知道为什么应用程序这么大。
我最近遇到了同样的问题。我做了程序目录,我不得不在第一次启动应用程序时下载很多图像。我决定先通过 运行 上传所有图片,而不是动态加载它们,因为程序应该在离线模式下工作。我是通过 AFNetworking pod "AFNetworking", "~> 2.0"
做到的。
#import <AFNetworking/AFNetworking.h>
NSMutableArray *imageURLs = [[NSMutableArray alloc] init]; //URLs to your images
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:3];
NSString *cacheDir = [NSSearchPathForDirectoriesInDomains
(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSMutableArray *operations = [[NSMutableArray alloc] init];
for (int i=0; i<imageURLs.count; i++){
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLs[i]]];
AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSString *filePath = [cacheDir stringByAppendingPathComponent:@"yourImageName.png"];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
[operation setCompletionBlock:^{
NSLog(@"Image downloaded");
}];
[operations addObject:operation];
}
[operationQueue addOperations:operations waitUntilFinished:NO];
前段时间我发布了这个问题: Cordova / Phonegap downloading a lot of images, best possible solution
但是没有人真正回答这个问题。
我决定做同样的申请,但现在 Objective C。 但我仍然有同样的问题:)
所以,我有 iOS 使用 Objective C 和 XCode 开发的应用程序。 这个应用程序应该可以离线和在线工作。 如果用户是第一次启动应用程序,他会看到进度条,所有数据和图像都已获取并下载到他的设备上。 在该进程应用重新加载(重新开始)之后
可以,但是我觉得app第一次启动太慢了(800多张图片)需要7多分钟,这对用户体验来说真的很糟糕。
以下是我的一些策略:
将所有图像下载为单个 ZIP 文件并将其解压缩到设备中
只下载部分图像(25%?),然后在后台下载其余部分,同时用户可以使用他的应用程序。在某些地方使用某种图像占位符?
哪种策略最好?也许有人有类似的经历?
步骤:1
我建议你不要第一次下载图片。只需提取所需的数据并输入数据库或您正在使用的任何技术,然后让使用进入应用程序。这几乎不需要几秒钟。
步骤:2
只下载当前需要展示的图片。记住不要在主线程上下载图像。下载后将它们保存在本地文件夹中。这样您就不需要再次下载相同的图像。由于您的应用程序支持离线模式,因此如果图像未提前下载,您可以使用占位符图像。
设置:3
在开始下载图片之前,请先检查它是否存在于您的本地文件夹中。
要下载图片你可以通过下面的link.
您应该只在要显示图像时才下载图像。我认为最简单的方法是使用 https://github.com/rs/SDWebImage。它将为您加载图像、缓存它,并在需要时清除缓存。
你已经得到了一些很好的答案。
而且你一开始只下载其中一些的想法也很好。
我建议您使用混合方法。
当应用程序启动时,您检查您有哪些图像并开始在低优先级的后台线程上下载其余图像,以便应用程序正常运行。
你也正常打开应用程序,每次你需要显示图像时,你检查你是否有它,如果没有,你马上下载。只拿到一个应该很快。
您没有向我们提供有关您的应用的太多详细信息,但您也可以将应用中的所有图像捆绑在一起(如果它们根本不发生变化)。并且对应用程序有一个很好的描述,这样用户就会知道为什么应用程序这么大。
我最近遇到了同样的问题。我做了程序目录,我不得不在第一次启动应用程序时下载很多图像。我决定先通过 运行 上传所有图片,而不是动态加载它们,因为程序应该在离线模式下工作。我是通过 AFNetworking pod "AFNetworking", "~> 2.0"
做到的。
#import <AFNetworking/AFNetworking.h>
NSMutableArray *imageURLs = [[NSMutableArray alloc] init]; //URLs to your images
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];
[operationQueue setMaxConcurrentOperationCount:3];
NSString *cacheDir = [NSSearchPathForDirectoriesInDomains
(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSMutableArray *operations = [[NSMutableArray alloc] init];
for (int i=0; i<imageURLs.count; i++){
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:imageURLs[i]]];
AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSString *filePath = [cacheDir stringByAppendingPathComponent:@"yourImageName.png"];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
[operation setCompletionBlock:^{
NSLog(@"Image downloaded");
}];
[operations addObject:operation];
}
[operationQueue addOperations:operations waitUntilFinished:NO];