Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Core Data

Core Data y Swift: Adicionando NSFetchedResultsController

by
Read Time:7 minsLanguages:
This post is part of a series called Core Data and Swift.
Core Data and Swift: NSFetchedResultsController
Core Data and Swift: Migrations

Spanish (Español) translation by steven (you can also view the original English article)

En este tutorial, continuamos nuestra exploración de la clase NSFetchedResultsController agregando la capacidad de actualizar y eliminar elementos pendientes. Notarás que actualizar y eliminar elementos pendientes es sorprendentemente fácil gracias al trabajo preliminar que establecimos en el tutorial anterior.

Prerrequisitos

Lo que cubro en esta serie sobre Core Data es aplicable a iOS 7+ y OS X 10.10+, pero el enfoque estará en iOS. En esta serie, trabajaré con Xcode 7.1 y Swift 2.1. Si prefieres Objective-C, te recomiendo leer mi serie anterior sobre el framework de datos básicos.

1. Actualización del nombre de un registro

Paso 1: Crear controlador de vista

Comienza creando una nueva subclase de UIViewController llamada UpdateToDoViewController. En UpdateToDoViewController.swift, declara una salida, textField de tipo UITextField!, y dos propiedades, managedObjectContext de tipo NSManagedObjectContext!record de tipo NSManagedObject!. Agrega una declaración de importación del framework Core Data en la parte superior.

A continuación, crea dos acciones, cancel(_:) y save(_:). Tus implementaciones pueden permanecer vacías por el momento.

Paso 2: Actualizar el Storyboard

Abre el guión gráfico principal, Main.storyboard, agrega un nuevo objeto de controlador de vista y establece su clase en UpdateToDoViewController en el Inspector de identidad. Presiona Control y arrastra desde la celda del prototipo en la instancia de ViewController a la instancia de UpdateToDoViewController. Selecciona Selección Segue > Mostrar en el menú que aparece y, en el Inspector de atributos, establece el identificador de segue en SegueUpdateToDoViewController.

Agrega un objeto UITextField a la vista del objeto UpdateToDoViewController y configúralo como lo hicimos con el campo de texto de la clase AddToDoViewController. No olvides conectar la salida del controlador de vista con el campo de texto.

Como en la clase AddToDoViewController, agrega dos elementos de botón de barra a la barra de navegación del controlador de vista, establece sus identidades en Cancelar y Guardar respectivamente, y conecta cada elemento de botón de barra a la acción correspondiente en el Inspector de conexiones.

Updating the StoryboardUpdating the StoryboardUpdating the Storyboard

Paso 3: Pasar una referencia

También necesitamos realizar algunos cambios en la clase ViewController. Comencemos actualizando prepareForSegue(_:sender:), buscamos el registro que corresponde con la selección del usuario y lo pasamos a la instancia UpdateToDoViewController.

Para finalizar, implementamos el método tableView(_:didSelectRowAtIndexPath:) del protocolo UITableViewDelegate. En este método, deseleccionamos la fila que el usuario tocó.

Paso 4: Completar el campo de texto

En el método viewDidLoad() de la clase UpdateToDoViewController, completa el campo de texto con el nombre del registro como se muestra a continuación.

Paso 5: Actualización del registro

En la acción cancel(_:), sacamos el controlador de vista de actualización de la pila de navegación del controlador de navegación.

En la acción save(_:), primero verificamos si el campo de texto está vacío y mostramos una alerta si lo está. Si el campo de texto contiene un valor válido, actualizamos el atributo name del registro y sacamos el controlador de vista de la pila de navegación del controlador de navegación.

La implementación de showAlertWithTitle(_:message:cancelButtonTitle:) es idéntica a la de la clase AddToDoViewController.

Esto es todo lo que se necesita para actualizar un registro utilizando Core Data. Ejecuta la aplicación para verificar que todo esté funcionando. El controlador de resultados obtenidos detecta automáticamente el cambio y notifica a su delegado, la instancia de ViewController. El objeto ViewController, a su vez, actualiza la vista de tabla para reflejar el cambio. Es fácil.

2. Actualización del estado de un registro

Paso 1: Actualización de ToDoCell

Cuando un usuario toca el botón a la derecha de una ToDoCell, el estado del elemento debe cambiar. Para lograr esto, primero necesitamos actualizar la clase ToDoCell. Abre ToDoCell.swift y agrega un typealias para un controlador llamado ToDoCellDidTapButtonHandler. A continuación, declara una propiedad, didTapButtonHandler, de tipo ToDoCellDidTapButtonHandler?.

En el método awakeFromNib() de la clase, invocamos un método auxiliar, setupView(), para configurar la celda de vista de tabla.

En setupView(), configuramos el objeto doneButton estableciendo imágenes para cada estado del botón y agregando la celda de vista de tabla como un objetivo. Cuando el usuario toca el botón, la celda de la vista de tabla recibe un mensaje de didTapButton(_:) en el que invocamos el cierre del didTapButtonHandler. Verás en un momento lo conveniente que es este patrón. Las imágenes se incluyen en los archivos fuente de este tutorial, que puedes encontrar en GitHub.

Paso 2: Actualización de ViewController

Gracias a la clase NSFetchedResultsController y la base que hemos establecido, solo necesitamos actualizar el método configureCell(_:atIndexPath:) en la clase ViewController.

Paso 3: Guardar cambios

Quizás te preguntes por qué no estamos guardando el contexto del objeto administrado. ¿No perderemos los cambios que hemos realizado si no los confirmamos en el almacén persistente? Si y no.

Es cierto que necesitamos escribir los cambios del contexto del objeto administrado en el almacén de respaldo en algún momento. Si no lo hacemos, el usuario perderá algunos de sus datos. Sin embargo, no es necesario guardar los cambios de un contexto de objeto administrado cada vez que realizamos un cambio.

Un mejor enfoque es guardar el contexto del objeto gestionado en el momento en que la aplicación pasa a segundo plano. Podemos hacer esto en el método applicationDidEnterBackground(_:) del protocolo UIApplicationDelegate. Abre AppDelegate.swift e implementa applicationDidEnterBackground(_:) como se muestra a continuación.

Sin embargo, esto no funciona si el usuario fuerza el cierre de la aplicación. Por lo tanto, es una buena idea guardar también el contexto del objeto administrado cuando se termina la aplicación. El método applicationWillTerminate(_:) es otro método del protocolo UIApplicationDelegate que notifica al delegado de la aplicación cuando la aplicación está a punto de finalizar.

Ten en cuenta que tenemos código duplicado en applicationDidEnterBackground(_:) y applicationWillTerminate(_:). Seamos inteligentes y creemos un método auxiliar para guardar el contexto del objeto gestionado y llamar a este método auxiliar en ambos métodos delegados.

3. Eliminación de registros

Te sorprenderás de las pocas líneas que se necesitan para eliminar registros utilizando la clase NSFetchedResultsController. Comienza implementando el método tableView(_:canEditRowAtIndexPath:) del protocolo UITableViewDataSource.

El segundo método del protocolo UITableViewDataSource que necesitamos implementar es tableView(_:commitEditingStyle:forRowAtIndexPath:). En este método, buscamos el objeto administrado que el usuario ha seleccionado para su eliminación y lo pasamos al método deleteObject(_:) del contexto del objeto administrado del controlador de resultados obtenido.

Debido a que ya implementamos el protocolo NSFetchedResultsControllerDelegate, la interfaz de usuario se actualiza automáticamente, incluidas las animaciones.

Conclusión

Espero que estés de acuerdo en que la clase NSFetchedResultsController es un miembro muy conveniente del framework Core Data. Si comprendes los conceptos básicos del framework Core Data, no será difícil ponerte al día con esta clase. Te animo a explorar más a fondo su API para descubrir qué más puede hacer por ti.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.