#ios #swift
#iOS #swift
Вопрос:
У меня есть простое приложение todo, в котором я просто сохраняю выборку основных данных с помощью контроллера NSfetchResult и обновляю может кто-нибудь сказать мне, как издеваться над основными данными
import UIKit
import CoreData
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
class ViewController: UITableViewController, NSFetchedResultsControllerDelegate, MyDataSendingDelegateProtocol, updateCell
{
var selectedObject: ToDoListItem!
func dataForUpdatingCell(title: String, note: String) {
print(title, note)
selectedObject.name = title
selectedObject.modifiedDate = Date()
selectedObject.notesName = note
save()
}
// Delegate Method.
func sendDataToFirstViewController(itemText: String, noteText: String) {
let newName = ToDoListItem(context: context)
newName.name = itemText
newName.modifiedDate = Date()
newName.createdAt = Date()
newName.notesName = noteText
self.save()
}
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<ToDoListItem> = {
// Create Fetch Request
let fetchRequest: NSFetchRequest<ToDoListItem> = ToDoListItem.fetchRequest()
// Configure Fetch Request
fetchRequest.sortDescriptors = [NSSortDescriptor(key: #keyPath(ToDoListItem.modifiedDate), ascending: false)]
// Create Fetched Results Controller
let fetchedResultsController = NSFetchedResultsController<ToDoListItem>(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
// Configure Fetched Results Controller
fetchedResultsController.delegate = self
return fetchedResultsController
}()
override func viewDidLoad() {
super.viewDidLoad()
title = "TodoList"
fetch()
// Do any additional setup after loading the view.
}
@IBAction func AddNewTapped(_ sender: UIBarButtonItem) {
let nextVC = storyboard?.instantiateViewController(withIdentifier: DetailViewController.identifier) as! DetailViewController
nextVC.delegate = self
navigationController?.pushViewController(nextVC, animated: true)
}
func fetch(){
do {
try self.fetchedResultsController.performFetch()
} catch {
let fetchError = error as NSError
print("Unable to Perform Fetch Request")
print("(fetchError), (fetchError.localizedDescription)")
}
}
func save(){
do{
try context.save()
}catch{
print(error.localizedDescription)
}
}
}
extension ViewController{
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
guard let items = fetchedResultsController.fetchedObjects else { return 0 }
return items.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) //as! TableViewCell
let entity = fetchedResultsController.object(at: indexPath)
cell.textLabel?.text = entity.name
cell.textLabel?.font = UIFont.systemFont(ofSize: 20)
cell.detailTextLabel?.text = entity.notesName
cell.detailTextLabel?.font = UIFont.systemFont(ofSize: 15)
return cell
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 70
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
selectedObject = fetchedResultsController.object(at: indexPath)
let vc = storyboard?.instantiateViewController(withIdentifier: "updateVC") as! UpdateViewController
vc.newTextForItem = selectedObject.name
vc.newTextForNote = selectedObject.notesName
vc.delegate = self
present(vc, animated: true, completion: nil)
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let commit = fetchedResultsController.object(at: indexPath)
fetchedResultsController.managedObjectContext.delete(commit)
save()
}
}
//MARK: - NSFectchResultControllerDelegate Methods.
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
if let newIndexPath = newIndexPath {
tableView.insertRows(at: [newIndexPath], with: .fade)
}
case .delete:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .automatic)
}
case .move:
guard let indexPath = indexPath else { return }
guard let newIndexPath = newIndexPath else { return }
tableView.moveRow(at: indexPath, to: newIndexPath)
case .update:
if let indexPath = indexPath {
tableView.reloadRows(at: [indexPath], with: .fade)
}
default:
tableView.reloadData()
break
}
}
}
Комментарии:
1. Почему вы хотите издеваться над core data?
2. по сути, мне было поручено изучить разработку, основанную на тестировании TDD, поэтому я пытаюсь издеваться над core data
3. ОК. Я подумал, что это может быть связано с тестированием. Однако издеваться над основными данными на самом деле не обязательно. При тестировании можно использовать хранилище в памяти; изменения в этом типе хранилища не сохраняются на диске, поэтому вы можете легко начать с пустого хранилища для каждого теста или тестового запуска.
4. возможно ли получить код, который подразумевает эти вещи, чтобы я мог лучше понять