iOS:下载AWS S3图像&将其缓存以备将来使用

时间:2016-06-15 12:30:24

标签: ios swift amazon-web-services amazon-s3 sdwebimage

我试图从Amazon S3存储桶下载图像(webp图像)并将其缓存,从早上开始拔我的头发。无论采取什么方法,我都遇到了一些或其他路障。我试图实现这一目标的方式不同,

  1. 子类化NSURLProtocol&使用SDWebImage检索图像,如博客文章here中所示。这种方法的问题在于,子类协议的 canInitWithRequest 方法永远不会被调用,即使我已经注册了我的子类NSURLProtocol类。
  2. 计划直接使用SDWebImage和其他库,但我们无法做到这一点,因为没有规定在SDWebImage中设置Authorization标头,即使我们尝试设置它也很难,SDWebImage会在创建时忽略它NSMutableURLRequest下载。
  3. 所以现在我可以选择使用Amazon SDK下载图像,然后使用SDWebImage的SDImageCache独立缓存它,或者我需要将SDWebImage源代码添加到我的项目中然后我需要修改它的来源以获取授权标头。

    请告诉我是否有更好的方法来实现这一点,如果我能指出什么是实现我想做的最好的方法,那就太棒了。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

说实话,我自己研究了很长时间,并且对AWS提供的内置缓存系统不满意。相反,我选择使用Kingfisher lein-flyway因为它是快速构建并且使用得很好。我强烈推荐它,因为它是高度可定制的,但也可以完美地工作"开箱即用"

答案 1 :(得分:0)

您可以选择翠鸟用于缓存的密钥。因此,创建一个预签名的s3 url,然后在加载图像时使用s3键作为缓存,而不是完整的预签名url。

            let getPreSignedURLRequest = AWSS3GetPreSignedURLRequest()
            getPreSignedURLRequest.bucket = media.bucket
            getPreSignedURLRequest.key = media.key
            getPreSignedURLRequest.httpMethod = .GET
            getPreSignedURLRequest.expires = Date(timeIntervalSinceNow: 3600)  // Change the value of the expires time interval as required
            AWSS3PreSignedURLBuilder.default().getPreSignedURL(getPreSignedURLRequest).continueWith { (task:AWSTask<NSURL>) -> Any? in
                if let error = task.error as NSError? {
                    print("Error: \(error)")
                    return nil
                }
                if let presignedURL = task.result {
                    DispatchQueue.main.async {
                        self.imageView.kf.indicatorType = .activity
                        let resource = ImageResource(downloadURL: URL(string: presignedURL.absoluteString!)!, cacheKey: media.key)
                        self.imageView.kf.setImage(with: resource)
                    }
                }
                return nil
            }