¿Cómo hago una request de búsqueda utilizando la nueva function fetchRequest de NSManagedObject?

En iOS 10, el equipo CoreData agregó un nuevo método "fetchRequest" a NSManagedObject. Se parece a esto:

public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> 

Lo cual, por lo que entiendo, nos permite replace esto:

 let request = NSFetchRequest<MyEntity>(entityName: "MyEntity") 

con este:

 let request = MyEntity.fetchRequest() 

Sin embargo, cuando trato de hacer una request simple como esta:

 let request = MyEntity.fetchRequest() do { results = try request.execute() } catch let error { print("failed to fetch coffee object: \(error)") } 

Recibo el siguiente error:

Error Domain = NSCocoaErrorDomain Code = 134060 "(null)" UserInfo = {message = No se puede get sin un NSManagedObjectContext en scope}

Entonces, claramente el error indica que necesito traer un NSManagedObjectContext al scope. He estado buscando ejemplos, pero parece que puede encontrar un ejemplo completo de cómo realizar una request utilizando las nuevas funciones de la API.

Pregunta

Utilizando las últimas características de API de Core Data, ¿cómo puedo realizar una request de recuperación simple? La pregunta subyacente es cómo llevo mi NSmanagedObjectCotnext al scope.

Debería tener en count que puedo realizar una request con éxito usando la syntax tradicional.

    Ok, me di count de dos maneras de hacer esto. El primer enfoque , que es similar a mi código de ejemplo, es simplemente:

     var moc: NSManagedObjectContext! let request = MyEntity.fetchRequest() var results : [MyEntity] do { results = try moc.fetch(request) } catch { // error stuff} 

    El segundo enfoque , que se mostró en WWDC 2016, utiliza una function llamada "ejecutar" en nuestro object de petición de recuperación.

    Si ve los detalles en NSFetchRequest, verá un comentario que indica claramente que la operación debe realizarse en un bloque.

      // Executes the fetch request using the current managed object context. This method must be called from within a block submitted to a managed object context. @available(iOS 10.0, *) public func execute() throws -> [ResultType] 

    Me di count de que esta era la manera de llevar a cabo la búsqueda:

     var moc: NSManagedObjectContext! let request = MyEntity.fetchRequest() var results : [MyEntity] moc.perform { self.results = try! request.execute() } 

    Para aquellos que roll su propio

    Si está desarrollando su propio código, puede encontrar que su código no se comstack. Incluido en el código generado automáticamente hay un nuevo método llamado fetchRequest que el comstackdor usa para pasar el tipo a lo largo. Esto es como se ve el código.

     @nonobjc public class func fetchRequest() -> NSFetchRequest<MyEntity> { return NSFetchRequest<MyEntity>(entityName: "MyEntity"); } 

    Para i OS 10 ( Swift 3 ), el path seguido me ayudó:

     var userRecordsArray: [UserProfile] = [] func getData() { let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserProfile") let managedContext = (UIApplication.shanetworking.delegate as! AppDelegate).persistentContainer.viewContext do { userRecordsArray = try managedContext.fetch(fetchRequest) as! [UserProfile] } catch { print("Fetching Failed") } }