Как издеваться над CoreData swift

#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. возможно ли получить код, который подразумевает эти вещи, чтобы я мог лучше понять

5. useyourloaf.com/blog/core-data-in-memory-store