2016-03-31 13 views
0

私はFirebaseバックエンドとImageShackのストレージを使用して画像をキャッシュするAlamofireAlamofireImageを使用しています。ときにはメモリが100MB以上になることもあります。アップロード前に画像のキャッシュを改善し、スケーリングを改善する方法を学びたい。Swift - AlamofireImage/ImageShackを使用してメモリを節約するには?

let photoCache = AutoPurgingImageCache(
     memoryCapacity: 100 * 1024 * 1024, 
     preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 
    ) 

これらメモリ容量を定義する方法はあり、preferredMemoryUsageAfterPurgeは、メモリを節約するために:たとえば、私はそのAutoPurgingImageCacheを使用して、クラス、プロジェクト全体で一つの共通のキャッシュを宣言していますか?正確にはどういう意味ですか?

私はdidFinishPickingImageためAlamofire.upload下に使用しています:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 

     let urlStr = "http://post.imageshack.us/upload_api.php" 
     let url = NSURL(string: urlStr)! 
     let imgData = UIImageJPEGRepresentation(image, 0.25)! 

     let keyData = "____IMGSHACK_API_KEY_____".dataUsingEncoding(NSUTF8StringEncoding)! 
     let keyJSON = "json".dataUsingEncoding(NSUTF8StringEncoding)! 
     let publicData = "no".dataUsingEncoding(NSUTF8StringEncoding)! 

     Alamofire.upload(.POST, url, headers: nil, 
         multipartFormData: { multipartFormData in 
          multipartFormData.appendBodyPart(data: imgData, name:"fileupload", fileName:"image", mimeType: "image/jpg") 
          multipartFormData.appendBodyPart(data: keyData, name: "key") 
          multipartFormData.appendBodyPart(data: keyJSON, name: "format") 
          multipartFormData.appendBodyPart(data: publicData, name: "public") 
      }, encodingCompletion: { encodingResult in 
       switch encodingResult { 
       case .Success(let upload, _, _): 
        upload.validate() 
        upload.responseJSON { response in 
         let responseJSON = response.result.value as? [String: AnyObject] 
         if let links = responseJSON!["links"] as? Dictionary<String, AnyObject> { 
          if let imgLink = links["image_link"] as? String { 
           self.postToFirebase(imgLink) 
           print(imgLink) 
          } 
         } 
        } 
       case .Failure(let encodingError): 
        print(encodingError) 
       } 
     }) 

     self.dismissViewControllerAnimated(true, completion: nil) 
     self.tableView.contentOffset = CGPointMake(0, -60); 

} 

私はUIImageJPEGRepresentation(画像、0.25)を考えます!はよく圧縮されていません。私の画像はインターネットからフルサイズで提供されます。アップロードのために圧縮する前に縮尺を変更した場合:

let size = CGSize(width: 500.0, height: 273.0) 
let scaledImage = image.af_imageScaledToSize(size) 

ウェブプラットフォームの画像品質が悪いと思います。だから私は、イメージのダウンロード後の規模やキャッシングを行います

//MARK: - Image Downloading 

    func getNetworkImage(urlString: String, comesFrom: String, completion: (UIImage -> Void)) -> (Request) { 

     return Alamofire.request(.GET, urlString).responseImage { (response) -> Void in 
      guard let image = response.result.value else { return } 
      completion(image) 

      if comesFrom == "collectionPage" { 
       self.cacheCollectionImage(image, urlString: urlString) 
      } 
      else if comesFrom == "postPage" { 
       self.cachePostImage(image, urlString: urlString) 
      } 

     } 
    } 

    //MARK: - Image Caching 

    func cacheCollectionImage(image: Image, urlString: String) { 

     let size = CGSize(width: 188.0, height: 120.0) 
     let scaledImage = image.af_imageScaledToSize(size) 

     photoCache.addImage(scaledImage, withIdentifier: urlString) 

    } 

    func cachePostImage(image: Image, urlString: String) { 

     let size = CGSize(width: 300.0, height: 165.0) 
     let scaledImage = image.af_imageScaledToSize(size) 

     photoCache.addImage(scaledImage, withIdentifier: urlString) 

    } 


    func cachedImage(urlString: String) -> Image? { 
     print("cachedImage() func ended") 
     return photoCache.imageWithIdentifier(urlString) 
    } 

また私のアプリケーションは40メガバイトメモリ使用量で開きます。そして、私が見るよりも最大トップ使用法130MBアップロードしてスクロールした後に戻るAutoPurgingImageCacheを使用してメモリを減らしていますが、まだそれほどだと思います。

これらの条件でメモリを節約するために私に助言をしてください。私はいくつかの説明が必要です、あなたはツールや戦略をできるだけすべてのプラットフォームのための良い品質としてそれを処理するために言ってみたい。

答えて

2

あなただけのコピー&はAlamofireImageからコードを貼り付けています

let photoCache = AutoPurgingImageCache(
    memoryCapacity: 100 * 1024 * 1024, 
    preferredMemoryUsageAfterPurge: 60 * 1024 * 1024 
) 

1024バイト×1024バイト×100は、インメモリキャッシュ100メガバイトを作成します。その制限に達すると、キャッシュサイズは60 MBに縮小されます。あなたがそのような大きなキャッシュをwan'tしない場合は、それを減らすだけです。ここに「正しい」番号はなく、ユースケースのみに依存します。個人的には、メモリキャッシュに20 MB、ディスクキャッシュに100 MBを使用します。

+1

http://meta.stackexchange.com/a/5235 – Darko

関連する問題