2016-07-26 10 views
0

私はiOSには比較的新しいので、拡張機能を使ってダウンロードとキャッシュを管理する際にイメージの配列を作成する方法を理解していただきありがとうと思います。私はカップルの時間のためにこれで円で回っていたので、それは脳の信頼に取り組むときだと思った。私はこのような画像をダウンロードしてキャッシュするためにUIImageViewの延長作成画像をキャッシュに保存してイメージアレイを作成する(Swift)

let imageCache = NSCache() 

extension UIImageView { 

func loadImageUsingCacheWithURLString(url: NSURL) { 

    self.image = nil 

    // First check if there is an image in the cache 
    if let cachedImage = imageCache.objectForKey(url) as? UIImage { 

     self.image = cachedImage 

     return 
    } 

    else { 
    // Otherwise download image using the url location in Google Firebase 
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in 

     if error != nil { 
      print(error) 
     } 
     else { 
      dispatch_async(dispatch_get_main_queue(), { 

       // Cache to image so it doesn't need to be reloaded every time the user scrolls and table cells are re-used. 
       if let downloadedImage = UIImage(data: data!) { 

        imageCache.setObject(downloadedImage, forKey: url) 
        self.image = downloadedImage 

       } 
      }) 
     } 
    }).resume() 
    } 
} 

を...ので、それはロードコレクションビュー画像の素晴らしい作品。しかし、イメージの配列をキャプチャして別のビューコントローラに渡すことができ、すべてをもう一度ダウンロードする必要はありません(データの無駄遣い)。これを行う別の関数を作成しましたが、imageholder.imageは常にnilです。私はそれが非同期の問題だとは思わない、すべての画像がこの時点でキャッシュされているので、私がデバッグしても、それは決してゼロにならない。

var imageHolder: UIImageView! 
var imagesArray:[UIImage] = [UIImage]() 

// Function to create images array to use on the photo view. 
func createImagesArray() { 

    for url in imagesURLArray { 

     imageHolder.loadImageUsingCacheWithURLString(url) 

     if imageHolder.image != nil { 

     imagesArray.append(imageHolder.image!) 
     } 

    } 
} 

シンプルなものが欠けているように感じますが、私は固執しています。ありがとうございました!

+0

これにはライブラリを使用するだけです。 https://github.com/Haneke/HanekeSwift https://github.com/onevcat/Kingfisherなどをご検討ください。 – Fattie

答えて

0
let imageCache = NSCache() 
let images:[UIImages] = [] 

extension UIImageView { 

func loadImageUsingCacheWithURLString(url: NSURL) { 

    self.image = nil 

    // First check if there is an image in the cache 
    if let cachedImage = imageCache.objectForKey(url) as? UIImage { 

     self.image = cachedImage 

     return 
    } 

    else { 
    // Otherwise download image using the url location in Google Firebase 
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in 

     if error != nil { 
      print(error) 
     } 
     else { 
      dispatch_async(dispatch_get_main_queue(), { 

       // Cache to image so it doesn't need to be reloaded every time the user scrolls and table cells are re-used. 
       if let downloadedImage = UIImage(data: data!) { 

        imageCache.setObject(downloadedImage, forKey: url) 
        self.image = downloadedImage 

       } 
      }) 
     } 
     }).resume() 
    } 
    //Creat array and append the last image to it. 
    self.images.append(self.image) 
} 
+0

残念ながら、私はフォローしていません。 let image:[UIImages] = [](typo:UIImage)を追加しました。 – Ben

+0

そうです、タイプミス、悪いです。次に、下部に、イメージを配列に追加します。 – impression7vx

+0

だからこそ、起こっているのは、 'self.image = ...'を呼び出してイメージを配列に保存した後です。 badaboom badabang – impression7vx

0

UIImageを返す拡張機能用の別の関数を作成しました。それを行った後、imagesArrayに追加する問題はありませんでした。

let imageCache = NSCache() 
var returnImage:UIImage = UIImage() 

func returnImageUsingCacheWithURLString(url: NSURL) -> (UIImage) { 

    // First check if there is an image in the cache 
    if let cachedImage = imageCache.objectForKey(url) as? UIImage { 

     return cachedImage 
    } 

    else { 
     // Otherwise download image using the url location in Google Firebase 
     NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) in 

      if error != nil { 
       print(error) 
      } 
      else { 
       dispatch_async(dispatch_get_main_queue(), { 

        // Cache to image so it doesn't need to be reloaded everytime the user scrolls and table cells are re-used. 
        if let downloadedImage = UIImage(data: data!) { 

         imageCache.setObject(downloadedImage, forKey: url) 
         returnImage = downloadedImage 

        } 
       }) 
      } 
     }).resume() 
     return returnImage 
    } 
} 
関連する問題