前段时间我发布了这个问题: Cordova / Phonegap downloading a lot of images, best possible solution
但没有人真的回答过这个问题。
我决定做相同的应用程序,但目前在Objective C中。 但我仍有同样的问题:)
所以,我使用Objective C和XCode开发了iOS应用程序。 这个应用程序可以在离线和在线工作。 如果用户是第一次启动应用程序,他会看到进度条,所有数据和图像都被提取并下载到他的设备。 在该流程应用程序重新加载(重新开始)之后
它有效,但我认为应用程序的首次启动速度太慢(超过800张图片)需要7分钟以上,这对用户体验非常不利。
以下是我的一些策略:
将所有图像下载为单个ZIP文件并将其解压缩到设备
只下载部分图片(25%?),然后在后台下载其余部分,而用户可以使用他的应用。在某些地方使用某种图像占位符?
哪种策略最好?也许有人有类似的经历?
答案 0 :(得分:2)
步骤:1
我建议你不要第一次下载图片。只需提取您所需的数据并提供数据库或您正在使用的技术,并将其用于应用程序内部。这应该只需要几秒钟。
步骤:2
仅下载当前需要显示的图像。请记住,不要在主线程上下载图像。下载后将它们保存在本地文件夹中。这样您就不需要再次下载相同的图像了。由于您的应用程序支持离线模式,因此如果先前未下载图像,则可以使用占位符图像。
Setp:3
在开始下载图像之前,请先检查本地文件夹中是否存在该图像。
要下载图片,您可以浏览以下链接。
答案 1 :(得分:0)
只有在要显示图像时才应下载图像。我认为最简单的方法是使用https://github.com/rs/SDWebImage。它将为您加载图像,缓存它,如果需要清除缓存。
答案 2 :(得分:0)
你已经得到了一些好的答案。
你在开始时只下载其中一些的想法也很好。
我建议你使用混合方法。
当应用程序启动时,您检查您拥有的图像并开始在优先级较低的后台线程上下载其余图像,以便应用程序正常工作。
此外,您正常打开应用程序,每次需要显示图像时,检查是否有图像,如果没有,则立即下载。只有一个人应该很快。
您没有向我们提供有关您应用的太多详细信息,但如果它们根本没有更改,您也可以将所有图片捆绑在应用中。并对应用程序有一个很好的描述,以便用户知道为什么应用程序如此之大。
答案 3 :(得分:0)
我最近遇到了同样的问题。我做了程序目录,我必须在第一个应用程序启动时下载大量图像。我决定通过首次运行上传所有图像,而不是动态加载它们,因为程序应该在离线模式下工作。我是通过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];