быстрое сохранение данных iOS UIImage

Я создаю следующий класс и хочу сохранить массив: [costCategory] на диск,

class costCategory : NSObject, NSCoding {
var name : String
var defaultValue : Int
var thisMonthsEstimate : Int
var sumOfThisMonthsActuals : Int
var riskFactor : Float
var monthlyAverage : Float
var icon: UIImage!

init (name:String, defaultValue:Int, thisMonthsEstimate:Int, sumOfThisMonthsActuals:Int, riskFactor:Float, monthlyAverage:Float, icon: UIImage) {
    self.name = name
    self.defaultValue = defaultValue
    self.thisMonthsEstimate = thisMonthsEstimate
    self.sumOfThisMonthsActuals = sumOfThisMonthsActuals
    self.riskFactor = riskFactor
    self.monthlyAverage = monthlyAverage
    self.icon = icon
}

// MARK: NSCoding

required init(coder decoder: NSCoder) {
    //Error here "missing argument for parameter name in call
    self.name = decoder.decodeObjectForKey("name") as! String
    self.defaultValue = decoder.decodeIntegerForKey("defaultValue")
    self.thisMonthsEstimate = decoder.decodeIntegerForKey("thisMonthsEstimate")
    self.sumOfThisMonthsActuals = decoder.decodeIntegerForKey("sumOfThisMonthsActuals")
    self.riskFactor = decoder.decodeFloatForKey("riskFactor")
    self.monthlyAverage = decoder.decodeFloatForKey("monthlyAverage")
    self.icon = decoder.decodeObjectForKey("icon") as! UIImage!
    super.init()
}

func encodeWithCoder(coder: NSCoder) {
    coder.encodeObject(self.name, forKey: "name")
    coder.encodeInt(Int32(self.defaultValue), forKey: "defaultValue")
    coder.encodeInt(Int32(self.thisMonthsEstimate), forKey: "thisMonthsEstimate")
    coder.encodeInt(Int32(self.sumOfThisMonthsActuals), forKey: "sumOfThisMonthsActuals")
    coder.encodeFloat(self.riskFactor, forKey: "riskFactor")
    coder.encodeFloat(self.monthlyAverage, forKey: "monthlyAverage")
    coder.encodeObject(self.icon, forKey: "icon")
}

}

Я сохраняю данные в viewController следующим образом:

class ViewController: UIViewController {

@IBOutlet weak var photo: UIImageView!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let defaults = NSUserDefaults.standardUserDefaults()
    let arrayOfObjectsKey = "arrayOfObjectsKey"
    var arrayOfObjects = [costCategory]()
    arrayOfObjects.append(costCategory(name: "Mark", defaultValue: 50, thisMonthsEstimate: 60, sumOfThisMonthsActuals: 70, riskFactor:80, monthlyAverage:90, icon: UIImage(named:"Mark.JPG")!))
    arrayOfObjects.append(costCategory(name: "Mary", defaultValue: 50, thisMonthsEstimate: 60, sumOfThisMonthsActuals: 70, riskFactor:80, monthlyAverage:90, icon: UIImage(named:"Mary.JPG")!))
    var arrayOfObjectsData = NSKeyedArchiver.archivedDataWithRootObject(arrayOfObjects)
    var arrayOfObjectsUnarchivedData = defaults.dataForKey("arrayOfObjectsKey")!
    var arrayOfObjectsUnarchived = NSKeyedUnarchiver.unarchiveObjectWithData(arrayOfObjectsUnarchivedData) as! [costCategory]
    **println(arrayOfObjectsUnarchived[0].icon)**
    **photo.image = arrayOfObjectsUnarchived[0].icon**
}

}

Я println (arrayOfObjectsUnarchived [0] .icon) обнаружил, что он равен нулю, не могу получить исходное изображение, которое я сохраняю. Почему? И использовать следующий метод для сохранения достаточно хорошо? У кого-нибудь есть другой метод, такой как fileManger? Спасибо!!!!

пусть по умолчанию = NSUserDefaults.standardUserDefaults ()

var arrayOfObjectsUnarchivedData = defaults.dataForKey ("arrayOfObjectsKey")!

var arrayOfObjectsUnarchived = NSKeyedUnarchiver.unarchiveObjectWithData (arrayOfObjectsUnarchivedData) как! [costCategory]


person Bog    schedule 26.09.2015    source источник


Ответы (1)


Хранить UIImage в NSUserDefaults - не лучшая идея.

Я бы посоветовал сохранять изображения в файловой системе, и вы можете сохранить их путь к файловой системе в своей модели, который затем может находиться в NSUserDefaults.

Однако, если вам действительно интересно, вот как изображения сохраняются в NSUserDefaults:

Написание UIImage:

let imageData = UIImageJPEGRepresentation(image, 1)
let relativePath = "image_\(NSDate.timeIntervalSinceReferenceDate()).jpg"
let path = self.documentsPathForFileName(relativePath)
imageData.writeToFile(path, atomically: true)
NSUserDefaults.standardUserDefaults().setObject(relativePath, forKey: "path")
NSUserDefaults.standardUserDefaults().synchronize()

Чтение UIImage:

let possibleOldImagePath = NSUserDefaults.standardUserDefaults().objectForKey("path") as String?

if let oldImagePath = possibleOldImagePath {
    let oldFullPath = self.documentsPathForFileName(oldImagePath)
    let oldImageData = NSData(contentsOfFile: oldFullPath)
    // here is your saved image:
    let oldImage = UIImage(data: oldImageData)
}

РЕДАКТИРОВАТЬ: по запросу OP

Шаг 1. Напишите метод, который берет имя изображения и возвращает вам путь к изображению в файловой системе. Здесь я сохраняю файлы в каталоге Documents.

- (NSString *)imagePathForImage:(NSString *)iImageName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:iImageName];

    return imagePath;
}

Шаг 2: Вызовите указанный выше метод и сохраните путь к изображению в своем costCategory. Я не пишу для этого код. Надеюсь, вы сможете это связать.

Шаг 3. Сохраните изображение в файловой системе. Передайте свое изображение и путь, полученный с помощью вышеуказанного метода.

- (void)saveImage:(UIImage *)iImage toPath:(NSString *)iImagePath {
    NSData *imageData = UIImagePNGRepresentation(iImage);
    [imageData writeToFile:iImagePath atomically:NO];
}

Шаг 4: Наконец, когда вы читаете свой объект из NSUserDefaults, получите свойство пути к изображению и вызовите метод ниже, чтобы получить и визуализировать изображение:

- (UIImage *)imageForPath:(NSString *)iImagePath {
    return [UIImage imageWithContentsOfFile:iImagePath];
}
person Abhinav    schedule 26.09.2015
comment
Вы действительно даете мне подсказку, чтобы сохранить изображения в файловой системе и сохранить системный путь в моей модели. Я отказываюсь от своей первоначальной идеи сохранить UIImage в моей модели. Но не могли бы вы дать мне простой код, чтобы продемонстрировать, как его сохранить? Я только начинаю изучать эту часть, не знаком с ней. Спасибо!!!! - person Bog; 26.09.2015
comment
Взгляните на мой Edit. Я надеюсь, что это помогает! - person Abhinav; 26.09.2015