2015-04-03 1 views
0

У меня есть приложение, которое загружает множество данных изображения с веб-сервера. Данные сохраняются на IPad с помощью:Как я могу использовать UIImage (contentsOfFile: String) с данными изображения, загружаемыми из Интернета?

func saveParsedObject(objectToSave:AnyObject,dataCode:Int) 
    { 
     var path:String! = self.convertDataCodeToPath(dataCode) 
     println("saveParsedObject - object::\(objectToSave)") 
     if NSKeyedArchiver.archiveRootObject(objectToSave, toFile: path) 
     { 
      println("Success writing parsed object to file!") 
     } 
     else 
     { 
      println("Unable to write parsed object to file!") 
     } 
    } 

данные позже открыт:

func loadParsedObject(dataCode:Int) -> AnyObject? 
    { 
     var path:String! = self.convertDataCodeToPath(dataCode) 
     println(" ****** path = \(path) ****** ") 
     var dataFromDisk:AnyObject? 
     dataFromDisk = NSKeyedUnarchiver.unarchiveObjectWithFile(path) 
     println(" ****** dataFromDisk = \(dataFromDisk) ****** ") 
     return dataFromDisk 
    } 

данные изображения сохраняются с этим кодом:

if let imgURLString = imageURLString 
     { 
      println(" ////// Image is not nil /////// ") 
      let imageURL = NSURL(string: imageURLString) 
      let imageData = NSData(contentsOfURL: imageURL!) 

      //println(imageData) 
      if let imgData = imageData 
      { 
       self.productImage = UIImage(data: imageData!) 
      } 
      else 
      { 
       println("Image data = nil") 
       //println(productName) 
      } 

     } 

Поскольку данные не сохраняется с UIImage(contentsOfFile:String), он кэшируется, когда я позже сделаю это:

if let isProductImgNil = productModel.productImage? 
     { 
      println(" -- product image is not nil -- ") 
// productView is my custom view for my productData which is in my productModel object 
       productView.backgroundImage.image = productModel.productImage? 
//productView.backgroundImage is a UIImageView 
//productModel.productImage is a UIImage 
     } 

Я нашел эти ссылки и попытался использовать их, чтобы изображения не кэшировались. Однако проблема намного выше. Мне нужно загрузить изображение, сохранить его на жесткий диск и загрузить его с помощью contentsOfFile, который использует строку не NSData, и я понятия не имею, как это сделать правильно или даже если этот подход имеет смысл.

Вот ссылки:

(1) Swift + Save and Load Image From DocumentDirectory

(2) SO: basic UIImage memory managment

(3) SO: My error but with local images located in .xcassets

(4) SO: Answers says what I should do and I do, however UImage can not be loaded with NSData with caching disabled

Раствор 1

Результат: Это то, что я сделал в начале (объяснение в (4)) данных является кэширование, но не загружены дважды, приложение вылетает через некоторое время (объяснение в (3)

кодекса выше

Решение 2

Результат: данных в кэше и снова загружены (еще хуже). Сбои намного быстрее ...

Код

Сохранение данных при обработке его (используется ссылка (1)):

if let imgURLString = imageURLString 
     { 
      println(" ////// Image is not nil /////// ") 
      let imageURL = NSURL(string: imageURLString) 
      let imageData = NSData(contentsOfURL: imageURL!) 

      var selectedImage = UIImage(data:imageData!) 


      let fileManager = NSFileManager.defaultManager() 

      var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String 

      var filePathToWrite = "\(paths)/\(imageURLString.lastPathComponent)" 

      var imageData1: NSData = UIImagePNGRepresentation(selectedImage) 

      fileManager.createFileAtPath(filePathToWrite, contents: imageData1, attributes: nil) 

      var getImagePath = paths.stringByAppendingPathComponent(imageURLString.lastPathComponent) 

      finalImagePath = getImagePath 

      if (fileManager.fileExistsAtPath(getImagePath)) 
      { 
       println(" --------------- ") 
       println(" Model - FILE AVAILABLE"); 
       println(getImagePath) 
       println(" --------------- ") 
       //Pick Image and Use accordingly 
       //var imageis: UIImage = UIImage(contentsOfFile: getImagePath)! 

       //let data: NSData = UIImagePNGRepresentation(imageis) 

      } 
      else 
      { 
       println(" Model - FILE NOT AVAILABLE"); 

      } 

     } 

и загрузка данных:

let fileManager = NSFileManager.defaultManager() 

    if (fileManager.fileExistsAtPath(productModel.finalImagePath!)) 
    { 
     println("FILE AVAILABLE"); 
     productView.backgroundImage.image = UIImage(contentsOfFile:productModel.finalImagePath)! 
    } 
    else 
    { 
     println(" - - - - - ") 
     println(productModel.finalImagePath!) 
     println("FILE NOT AVAILABLE"); 

    } 

Примите к сведению от:

productView.backgroundImage.image = UIImage(contentsOfFile:productModel.finalImagePath)! 

, который не помогает при кешировании ... но загружает изображение в представление.

Любые предложения приветствуются. Я собираюсь попробовать другие вещи в меньшем проекте, потому что, возможно, это проблема проекта.

Я также попытаюсь реализовать пул объектов DP, но почему-то я думаю, что это не поможет, поскольку одна категория имеет 202 продукта, а память скачет примерно до 250-300 МБ. Если я открою что-нибудь еще, я получу предупреждения о памяти. Мало больше всплесков памяти, и приложение падает.

Я также могу попробовать динамическую загрузку, так как продукты загружаются в UIScrollView, но это будет очень много работать, так как у меня мало времени. И да, я знаю, что должен был пойти с CoreData, но у меня не было времени, чтобы изучить его. Приложение должно быть выполнено примерно через 40 дней (осталось мало времени), и я новичок в быстром :). Спасибо за вашу помощь :).

+1

Если у вас мало времени, вы должны просто использовать 'SDWebImage'. Он делает все это для вас, правильный путь. –

+0

Я рассмотрю его. Большое спасибо :) –

+0

Приложение зайдет в магазин приложений. Я прочитал, что некоторые приложения с некоторыми типами фреймов отклоняются. В этом случае? Я упустил это сообщение SO http://stackoverflow.com/questions/25866049/create-own-ios-framework. –

ответ

1

Если у вас мало времени, вы должны просто использовать SDWebImage. Он делает все это для вас, правильный путь.