Я работаю над своим первым проектом с CoreData, и у меня есть настройка модели данных.
У меня есть таблица с кнопкой «Добавить», которая вызывает предупреждение и позволяет пользователю ввести строку:
func handleAdd() {
let alert = UIAlertController(title: "New Company", message: "Add a new company", preferredStyle: .alert)
let saveAction = UIAlertAction(title: "Save", style: .default) {
[unowned self] action in
guard let textField = alert.textFields?.first,
let newCompany = textField.text else {
return
}
self.save(name: newCompany)
self.tableView.reloadData()
}
let cancelAction = UIAlertAction(title: "Cancel", style: .default)
alert.addTextField()
alert.addAction(saveAction)
alert.addAction(cancelAction)
present(alert, animated: true)
}
Строка добавляется в массив NSManagedObject:
func save(name: String) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
// 1
let managedContext =
appDelegate.persistentContainer.viewContext
// 2
let entity =
NSEntityDescription.entity(forEntityName: "Company",
in: managedContext)!
let company = NSManagedObject(entity: entity,
insertInto: managedContext)
// 3
company.setValue(name, forKeyPath: "name")
// 4
do {
try managedContext.save()
companies.append(company)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
Пока все выглядит хорошо, за исключением того, что я хочу, чтобы приложение запускалось с 5 уже установленными ячейками, а затем позволяло пользователю добавлять/удалять по своему желанию. Как установить 5 значений по умолчанию, с которыми я хочу запускать приложение? Я попытался добавить приведенный ниже код в viewWillAppear.
let entity =
NSEntityDescription.entity(forEntityName: "Company",
in: managedContext)!
let company = NSManagedObject(entity: entity,
insertInto: managedContext)
company.setValue("Apple", forKeyPath: "name")
company.setValue("Google", forKeyPath: "name")
company.setValue("Facebook", forKeyPath: "name")
company.setValue("Tesla", forKeyPath: "name")
company.setValue("Twitter", forKeyPath: "name")
self.save(name: "Apple")
self.save(name: "Google")
self.save(name: "Facebook")
self.save(name: "Tesla")
self.save(name: "Twitter")
Во время загрузки они все появляются. Затем, когда я ухожу со страницы и возвращаюсь, они снова добавляются. Я знаю, что это потому, что они находятся в viewWillAppear и вызываются каждый раз при загрузке страницы.
Документы Apple (Руководство по программированию основных данных) немного сложно проглотить новичку, но они говорят
Для небольших наборов данных создавайте управляемые объекты непосредственно в коде.
Если вы используете iOS или создаете приложение для OS X, которое не основано на документах, вы можете добавить проверку при запуске приложения, чтобы определить, существует ли файл в месте, указанном вами для магазина приложений. Если это не так, вам нужно импортировать данные.
Я считаю, что второй фрагмент - это то, что я ищу в своем случае (поправьте меня, если я ошибаюсь), однако я не уверен, как его реализовать, поэтому любая помощь в том, как установить эти значения по умолчанию, чтобы они добавлялись один раз (под нагрузкой) и только один раз будет очень признателен!
Вот инициализаторы, если они представляют интерес
var companies = [NSManagedObject]()
var container: NSPersistentContainer!
let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let companyEntity = "Company"
РЕДАКТИРОВАТЬ: код добавлен в делегат приложения
let vc = ViewController()
let entity = NSEntityDescription.entity(forEntityName: "Company", in: managedContext)!
let company = NSManagedObject(entity: entity,insertInto: managedContext)
let userDefaults = UserDefaults.standard
userDefaults.set(true, forKey: "firstRun")
if userDefaults.valueForKey("firstRun") == true {
company.setValue("Apple", forKeyPath: "name")
company.setValue("Google", forKeyPath: "name")
company.setValue("Facebook", forKeyPath: "name")
company.setValue("Tesla", forKeyPath: "name")
company.setValue("Twitter", forKeyPath: "name")
vc.save(name: "Apple")
vc.save(name: "Google")
vc.save(name: "Facebook")
vc.save(name: "Tesla")
vc.save(name: "Twitter")
userDefaults.set(false, forKey: "firstRun")
}
do
. Используйте отладчик или вставьте строки печати, чтобы увидеть, что происходит. 18.01.2017firstRun
в пользовательских настройках по умолчанию наtrue
. 18.01.2017