На самом деле не следует сохранять данные изображения в CoreData или UserDefaults (последний - просто файл .plist), так как изображения, как правило, имеют большой размер.
Вам лучше не сохранять String(?)
значения для изображения, скажем, необязательные imageUrlString
, и необязательные значения var imageUrl: URL?
.Затем изображение можно получить при загрузке приложения или при необходимости (например, с помощью PINRemoteImage
[страница github] ).
Ниже приведен пример UserDefaults
, где у вас есть только один, но вы можете хранить словарь Dream
компонентов (или использовать что-то вроде Realm
[документы] или CoreData
[документы] для хранения более полных Dream
экземпляров)
import Foundation
import UIKit
import PINRemoteImage
class Dream {
var imageUrlString: String?
var name: String?
var timeStampString: String = ""
init(fromUserDefaults: Bool) {
if fromUserDefaults {
self.imageUrlString = StorageService.instance.imageUrlString
self.name = StorageService.instance.nameString
self.timeStampString = StorageService.instance.timeStampString
}
}
}
extension Dream {
var imageUrl: URL? {
guard let imageUrlString = imageUrlString else { return nil }
return URL(string: imageUrlString)
}
var timeStamp: Date? {
//Insert logic here to return a date in the desired format, from the timeStampString - e.g.
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX") //For example
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" //For example
guard let dateFromString = formatter.date(from: timeStampString) else { return nil }
return dateFromString
}
}
//Create a singleton to handle access to userDefaults safely
class StorageService {
//MARK: Singleton
static let instance = StorageService()
//MARK: Private initialiser
private init() {}
private enum UserDefaultsKeys: String {
case imageUrlString
case nameString
case timeStampString
}
var imageUrlString: String? {
get {
return UserDefaults.standard.string(forKey: UserDefaultsKeys.imageUrlString.rawValue) ?? nil
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.imageUrlString.rawValue)
}
}
var nameString: String? {
get {
return UserDefaults.standard.string(forKey: UserDefaultsKeys.nameString.rawValue) ?? nil
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.nameString.rawValue)
}
}
var timeStampString: String {
get {
return UserDefaults.standard.string(forKey: UserDefaultsKeys.timeStampString.rawValue) ?? ""
}
set {
UserDefaults.standard.set(newValue, forKey: UserDefaultsKeys.timeStampString.rawValue)
}
}
}
Затем вы можете использовать pin_setImage
(или что-то еще), чтобы загрузить изображение из экземпляра сна, где бы оно ни требовалось, например:
var imageView: UIImageView = {
let img = UIImageView()
img.pin_setImage(from: yourDreamInstance.imageUrl)
return img
}()