【问题标题】:iOS downloading a lot of images, best possible solutioniOS下载大量图像,最好的解决方案
【发布时间】:2015-04-28 06:54:11
【问题描述】:

前段时间我发过这个问题: Cordova / Phonegap downloading a lot of images, best possible solution

但没有人真正回答这个问题。

我决定做同样的应用程序,但现在在 Objective C 中。 但我仍然有同样的问题:)

所以,我有使用 Objective C 和 XCode 开发的 iOS 应用程序。 这个应用程序应该可以离线和在线工作。 如果用户是第一次启动应用程序,他会看到进度条,所有数据和图像都会被提取并下载到他的设备上。 在该进程应用程序重新加载(重新启动)之后

确实可以,但是我觉得第一次启动app太慢了(超过800张图片)需要7分钟以上,这对用户体验来说真的很糟糕。

以下是我的一些策略:

  • 将所有图片下载为单个 ZIP 文件并解压到设备中

  • 仅下载部分图像(25% ?),然后在后台下载其余图像,而用户可以使用他的应用程序。在某些地方使用某种图像占位符?

哪种策略最好?也许有人有类似的经历?

【问题讨论】:

    标签: ios xcode image download


    【解决方案1】:

    步骤:1

    我建议您不要第一次下载图像。只需提取您所需的数据并提供您的数据库或您正在使用的任何技术,然后让使用进入应用程序。这应该只需要几秒钟。

    步骤:2

    仅下载当前需要显示的图像。记住不要在主线程上下载图像。下载后将它们保存在本地文件夹中。这样您就不需要再次下载相同的图像。由于您的应用程序支持离线模式,因此如果之前未下载图像,您可以使用占位符图像。

    设置:3

    在开始下载图像之前,首先检查它是否存在于您的本地文件夹中。

    要下载图片,您可以通过以下链接。

    1. Download an image and save it
    2. download and create an image from a url
    3. iOS async image download

    【讨论】:

      【解决方案2】:

      您应该仅在要显示图像时才下载图像。我认为最简单的方法是使用https://github.com/rs/SDWebImage。它将为您加载图像,缓存它,如果需要,清除缓存。

      【讨论】:

        【解决方案3】:

        你已经得到了一些很好的答案。

        你在开始时只下载其中一些的想法也很好。

        我建议您使用混合方法。

        当应用启动时,您检查您拥有的图像并开始在低优先级的后台线程上下载其余图像,以便应用正常运行。

        此外,您还可以正常打开应用程序,每次需要显示图像时检查是否有,如果没有,请立即下载。得到一个应该很快。

        您没有向我们提供有关您的应用的太多详细信息,但您也可以将应用中的所有图像捆绑在一起(如果它们根本没有变化)。并对应用进行良好的描述,以便用户知道为什么应用如此之大。

        【讨论】:

          【解决方案4】:

          我最近遇到了同样的问题。我做了程序目录,我必须在第一次启动应用程序时下载很多图像。我决定通过第一次运行上传所有图像,而不是动态加载它们,因为程序应该在离线模式下工作。我是通过AFNetworkingpod "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];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-10
            • 1970-01-01
            • 2018-10-04
            • 2012-10-30
            • 2019-09-24
            • 2014-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多