В вашем xcdatamodeld
определите сущность, например User
:
Добавить атрибут с трансформируемым типом. Назовите это «книги».
Затем установите класс атрибута Transformable в массив Book. В поле Custom Class
ниже.
Используйте следующий код, чтобы получить текущий массив из текущего контекста. Эти методы должны входить в некоторый класс DataManager (который должен быть одноэлементным):
import CoreData
open class DataManager: NSObject {
public static let sharedInstance = DataManager()
private override init() {}
// Helper func for getting the current context.
private func getContext() -> NSManagedObjectContext? {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return nil }
return appDelegate.persistentContainer.viewContext
}
func retrieveUser() -> NSManagedObject? {
guard let managedContext = getContext() else { return nil }
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User")
do {
let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
if result.count > 0 {
// Assuming there will only ever be one User in the app.
return result[0]
} else {
return nil
}
} catch let error as NSError {
print("Retrieiving user failed. \(error): \(error.userInfo)")
return nil
}
}
func saveBook(_ book: Book) {
print(NSStringFromClass(type(of: book)))
guard let managedContext = getContext() else { return }
guard let user = retrieveUser() else { return }
var books: [Book] = []
if let pastBooks = user.value(forKey: "books") as? [Book] {
books += pastBooks
}
books.append(book)
user.setValue(books, forKey: "books")
do {
print("Saving session...")
try managedContext.save()
} catch let error as NSError {
print("Failed to save session data! \(error): \(error.userInfo)")
}
}
}
Вам также понадобится метод для создания пользователя (и, вероятно, удаления, при условии, что мы хотим следовать CRUD). Во-первых, вам нужно получить ссылку на пользовательскую сущность, чтобы создать ее. Это определение должно быть в верхней части вашего класса DataManager.
extension DataManager {
private lazy var userEntity: NSEntityDescription = {
let managedContext = getContext()
return NSEntityDescription.entity(forEntityName: "User", in: managedContext!)!
}()
}
А затем реализуйте эту функцию, чтобы создать ее.
extension DataManager {
/// Creates a new user with fresh starting data.
func createUser() {
guard let managedContext = getContext() else { return }
let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
do {
try managedContext.save()
} catch let error as NSError {
print("Failed to save new user! \(error): \(error.userInfo)")
}
}
}
Теперь просто позвоните:
DataManager.sharedInstance.createUser()
для создания нового пользователя.
Затем, чтобы добавить книги в хранилище пользователя:
DataManager.sharedInstance.saveBook(book)