Сохранить uiimageview в coredata как бинарные данные Swift (5)
Я пытаюсь сохранить изображение в виде изображения для двоичных данных в основных данных. Мой код не работает. Имеется ошибка компиляции. В контроллере View он не регистрируется cdHandler. Все, что я хочу сделать, это сохранить imaveview как двоичные данные в базовой модели данных. У меня есть 2 класса, делегат приложения и контроллер представления.
КОНТРОЛЛЕР ВИДА КЛАССА
import UIKit
import CoreData
class ViewController: UIViewController {
var canVasView = UIImageView()
@objc func hhh() {
let photo = self.canVasView.image
let data = photo!.pngData()
if cdHandler.saveObject(pic: data!){
}
}
}
APP DELEGATE
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
lazy var persistentContainer: NSPersistentContainer = {
/*
The persistent container for the application. This implementation
creates and returns a container, having loaded the store for the
application to it. This property is optional since there are legitimate
error conditions that could cause the creation of the store to fail.
*/
let container = NSPersistentContainer(name: "Model")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
class cdHandler: NSObject {
private class func getContext() -> NSManagedObjectContext {
let appdeleagetzz = UIApplication.shared.delegate as! AppDelegate
return appdeleagetzz.persistentContainer.viewContext
}
class func saveObject(pic: Data, userName: String) -> Bool {
let context = getContext()
let entity = NSEntityDescription.entity(forEntityName: "User", in: context)
let managedObject = NSManagedObject(entity: entity!, insertInto: context)
managedObject.setValue(pic, forKey:"pic")
managedObject.setValue(userName, forKey:"userName")
do {
try context.save()
return true
} catch {
return false
}
}
class func deletObject(user: User) -> Bool {
let context = getContext()
context.delete(user)
do {
try context.save()
return true
} catch {
return false
}
}
class func fetchObject() -> [User]? {
do {
let context = getContext()
return try context.fetch(User.fetchRequest())
} catch {
return [User]()
}
}
}
}
1 ответ
Сообщение об ошибке, * Значение типа "AppDelegate" не имеет члена с именем "persistentContainer", объясняет проблему. Действительно, когда я смотрю на код вашего AppDelegate
класс, я могу подтвердить, что у него нет члена с именем 'persistentContainer'. (Если я правильно читаю, последние две строки в файле закрывают фигурные скобки. Первая закрывает ваши cdHandler
вложенный класс, а второй закрывает ваш AppDelegate
учебный класс.)
Сделайте следующее упражнение. В XCode, нажмите в меню: Файл > Новый проект и выберите iOS, Приложение и Single View App. Назовите свой новый проект Junk. Установите флажок Основные данные. Нажмите кнопку Создать. После того, как это сделано, посмотрите на AppDelegate.swift, который создал XCode, и в AppDelegate
класс, как видите, содержит 8 функций (func
). 7-й lazy var persistentContainer
, Ага! Компилятор говорит вам, что вы, вероятно, не должны были удалять эти 8 функций, persistentContainer
в частности.
Вы должны скопировать это persistentContainer
Func из этого мусорного проекта в ваш AppDelegate
класс в вашем реальном проекте. Или, чтобы избежать будущих неприятностей, рассмотрите возможность копирования большинства других 7 функций. Как вы можете видеть, большинство из них ничего не делают, кроме как предоставить комментарии с объяснениями, которые полезны для начинающих. После того, как вы закончили копирование, закройте проект Junk. (Я перезаписываю свой Junk- проект новым Junk- проектом несколько раз в неделю, особенно когда отвечаю на вопросы Stackru.)
Это должно исправить эту конкретную ошибку и ответить на этот вопрос. Вперед к следующему вопросу.:)
Ответ на комментарий, что вы все еще получаете ошибку с cdHandler
Больше нечего продолжать, я предполагаю, что ошибка, на которую вы ссылаетесь, это ошибка компилятора, все еще на вашем скриншоте. Другими словами, вы говорите, что добавление persistentContainer
определение не сделало это лучше.
Ну, это работает для меня. Пожалуйста, замените весь код в вашем классе AppDelegate.swift следующим, соберите и запустите его…
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppDelegate.cdHandler.testGetContext()
return true
}
lazy var persistentContainer: NSPersistentContainer = {
/*
The persistent container for the application. This implementation
creates and returns a container, having loaded the store for the
application to it. This property is optional since there are legitimate
error conditions that could cause the creation of the store to fail.
*/
let container = NSPersistentContainer(name: "Junk")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
class cdHandler: NSObject {
private class func getContext() -> NSManagedObjectContext {
let appdeleagetzz = UIApplication.shared.delegate as! AppDelegate
return appdeleagetzz.persistentContainer.viewContext
}
class func testGetContext() {
let context = getContext()
print("getContext() succeeded, got \(context)")
}
class func saveObject(pic: Data, userName: String) -> Bool {
let context = getContext()
let entity = NSEntityDescription.entity(forEntityName: "User", in: context)
let managedObject = NSManagedObject(entity: entity!, insertInto: context)
managedObject.setValue(pic, forKey:"pic")
managedObject.setValue(userName, forKey:"userName")
do {
try context.save()
return true
} catch {
return false
}
}
class func deletObject(user: NSManagedObject) -> Bool {
let context = getContext()
context.delete(user)
do {
try context.save()
return true
} catch {
return false
}
}
}
}
Вы видите, что компилируется без ошибок. Кроме того, он запускается, и метод AppDelegate.cdhandler.getContext() работает. Как видите, в AppDelegate.application(application:didFinishLaunchingWithOptions:), I have added a call to a new method which I defined later,
AppDelegate.cdHandler.testGetContext()`. Работает отлично.
Вы получаете другую ошибку сейчас? Если это так, вам нужно указать, является ли это ошибка сборки или запуска. В любом случае скопируйте и вставьте текст ошибки в свой вопрос и сообщите нам, где она произошла.