У меня есть приложение, которое загружает множество данных изображения с веб-сервера. Данные сохраняются на 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
Раствор 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 дней (осталось мало времени), и я новичок в быстром :). Спасибо за вашу помощь :).
Если у вас мало времени, вы должны просто использовать 'SDWebImage'. Он делает все это для вас, правильный путь. –
Я рассмотрю его. Большое спасибо :) –
Приложение зайдет в магазин приложений. Я прочитал, что некоторые приложения с некоторыми типами фреймов отклоняются. В этом случае? Я упустил это сообщение SO http://stackoverflow.com/questions/25866049/create-own-ios-framework. –