En busca de un tutorial claro sobre el NSPsistentContainer revisado en Xcode 8 con Swift 3

He revisado Apple's:

Xcode 8 Notas de la versión:
https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html

Migración a Swift 2.3 o Swift 3 desde Swift 2.2
https://swift.org/migration-guide/

Novedades de Core Data en macOS 10.12, iOS 10.0, tvOS 10.0 y watchOS 3.0
https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html#//apple_ref/doc/uid/TP40017342-CH1-DontLinkElementID_1

Y muchos otros … pero el único documento que debería estar disponible de Apple, la Guía de progtwigción de datos básicos, no se ha actualizado desde Swift 2.
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/FetchingObjects.html#//apple_ref/doc/uid/TP40001075-CH6-SW1

Lo ideal es que esté buscando algo así, pero para Swift 3.
https://www.raywenderlich.com/115695/getting-started-with-core-data-tutorial

Cualquier contacto sería muy apreciado.

Comentario de Tom (abajo) ¿Qué paso me falta?

1) Crear un nuevo proyecto "Prueba"

2) Seleccione usar CoreDate (Esto crea Test.xcdatamodeld)

Esto completará automáticamente AppDelegate con lo siguiente (se eliminan los comentarios pnetworkingeterminados):

func applicationWillTerminate(_ application: UIApplication) { self.saveContext() } lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "Test") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() func saveContext () { let context = persistentContainer.viewContext if context.hasChanges { do { try context.save() } catch { let nserror = error as NSError fatalError("Unresolved error \(nserror), \(nserror.userInfo)") } } } 

3) Crear entidad "Foo"

4) Agregue el atributo "bar" tipo String

5) En ViewController.swift, agregue lo siguiente (Esto se copió de Apple, acabo de replace "… use" con "print")

 func findAnimals() { let request: NSFetchRequest<Foo> = Foo.fetchRequest do { let searchResults = try context.fetch(request) print(searchResults) } catch { print("Error with request: \(error)") } } 

6) Agregue findAnimals () bajo la function override viewDidLoad ().

Sin embargo, esto tiene errores específicamente:

  1. NSFetchRequest <Uso del tipo no declarado 'NSFetchRequest'
  2. context <Uso del identificador no resuelto 'context'

7) Entonces regrese y agregue algo de esto a la function bajo viewController para hacer que el contenedor esté accesible (que no estaba en la forma de ejemplo Apple).

 let context = (UIApplication.shanetworking.delegate as! AppDelegate).persistentContainer.viewContext 

Muy bien, eliminamos 1 del error 2 pero el error "Uso del tipo no declarado 'NSFetchRequest'" permanece.

Y aquí es donde estoy atrapado. Incluso después de revisar todos los materiales publicados de Apple, no puedo encontrar un ejemplo completo.

@Aaron Gracias de nuevo por el enlace de video, eso me llevó por el buen path. A continuación se muestra una descripción rápida del mínimo necesario para get, agregar y eliminar datos básicos con Swift 3 en Xcode 8.

  1. Nuevo proyecto> Aplicación de vista única de iOS
  2. Nombre del producto: "Muestra"
  3. Use datos básicos (marcados)
  4. Salvar
  5. Abrir Sample.xcdatamodeld
  6. Agregar y entidad: "SampleEntity"
  7. Use el inspector del Modelo de datos para configurar Codegen (en Clase) en "Definición de class"
  8. Cree un atributo bajo la nueva entidad: "sampleAttribute"
  9. Abra ViewController.swift
  10. En "importar UIKit" agregar "importar CoreData"
  11. En Class ViewController agregue lo siguiente:

      deje context = (UIApplication.shanetworking.delegate como! AppDelegate) .persistentContainer.viewContext
    
     // Obtener datos de él atributo
     func getSample () {
         dejar request: NSFetchRequest = SampleEntity.fetchRequest ()
         request.resultType = NSFetchRequestResultType.dictionaryResultType
         hacer
             deje searchResults = intente context.fetch (solicite como! NSFetchRequest <NSFetchRequestResult>) como!  [NSDictionary]
             deje que searchResultsArray = searchResults.map {$ 0 ["sampleAttribute"] como!  Cuerda}
             print ("searchResultsArray", searchResultsArray)
         } captura {
             print ("Error con la request: \ (error)")
         }
     }
    
     // Guardar en el atributo
     func setSample () {
         deje saveSample = SampleEntity (context: context)
         saveSample.sampleAttribute = "Guardar una nueva cadena".
         hacer
             intente context.save ()
         } captura {
              imprimir ("Error con save: \ (error)")
         }
     }
    
     // borrar el atributo
     func resetSample () {
         deje claroMuestra: NSFetchRequest = SampleEntity.fetchRequest ()
         let deleteResults = NSBatchDeleteRequest (fetchRequest: clearSample como! NSFetchRequest <NSFetchRequestResult>)
         hacer
             intente context.execute (deleteResults)
             intente context.save ()
         } captura {
             imprimir ("Error con save: \ (error)")
         }
     } 
  12. En override func viewDidLoad () agregue lo siguiente:

      get la muestra()
     setSample ()
     get la muestra()
     resetSample ()
     get la muestra() 
  13. Ejecutar y verá lo siguiente impreso en el área de debugging:

      searchResultsArray [] // Inicialmente el atributo está vacío
     searchResultsArray ["Guardar nueva cadena."] // El atributo ahora contiene la cadena 
     searchResultsArray [] // Este atributo ha sido borrado 

Puede ser el video de este año WWDC Lo nuevo en Core Data puede brindarte más dentro.

Aproximadamente a los 31:20 minutos, muestra un código con respecto a NSFetchRequest .

Desde mi entendimiento, NSPersistentContainer desacopla el context principal y el context de los trabajadores de una manera simple. Uno puede simplemente llamar a container.viewContext para cualquier acceso a datos de nivel de UI (antiguo NSMainQueueConcurrencyType), y usar container.newBackgroundContext para otro trabajo de import de datos (antiguo NSPrivtaeQueueConcurrencyType). Y al establecer automaticallyMergesChangesFromParent en true a cualquier context, es igual a la vieja escucha de NSManagedObjectContextDidSaveNotification .

Referencia: http://holko.pl/2016/06/23/core-data/

Todavía no puedo dejar comentarios. Entonces déjame ponerlo aquí. Creo que estos dos videos te ayudarán mucho. ¡Los grandes cursos de Stanford de Paul Hegarty están actualizados!

https://www.youtube.com/watch?v=ssIpdu73p7A – conferencia sobre CoreData https://www.youtube.com/watch?v=whF63GTaW1w – demostración para usar CoreData.