web-dev-qa-db-fra.com

Comment puis-je faire une demande de récupération à l'aide de la nouvelle fonction fetchRequest de NSManagedObject?

Dans iOS 10, l'équipe CoreData a ajouté une nouvelle méthode "fetchRequest" à NSManagedObject. Cela ressemble à ceci:

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

Ce qui, d'après ce que je comprends, nous permet de remplacer ceci:

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

avec ça:

let request = MyEntity.fetchRequest()

Cependant, lorsque j'essaie de faire une demande simple comme celle-ci:

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

Je reçois l'erreur suivante:

Erreur Domain = NSCocoaErrorDomain Code = 134060 "(null)" UserInfo = {message = Impossible de récupérer sans un NSManagedObjectContext dans la portée}

Donc, clairement l'erreur indique que je dois mettre un NSManagedObjectContext dans la portée. J'ai cherché des exemples, mais je peux trouver un exemple complet de la façon d'exécuter une demande en utilisant les nouvelles fonctionnalités de l'API.

Question

En utilisant les dernières fonctionnalités de l'API Core Data, comment puis-je faire une simple demande de récupération? La question sous-jacente est de savoir comment intégrer mon NSmanagedObjectCotnext dans la portée.

Je dois noter que je suis en mesure de faire une demande avec succès en utilisant la syntaxe traditionnelle.

22
Dan Beaulieu

Ok, j'ai trouvé deux façons de faire ça. première approche, qui est similaire à mon exemple de code est simplement:

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

 do {
     results = try moc.fetch(request)
 } catch { // error stuff}

deuxième approche, qui a été montrée dans WWDC 2016 utilise une fonction nommée "exécuter" sur notre objet de demande de récupération.

Si vous affichez les détails sur NSFetchRequest, vous verrez un commentaire qui indique clairement que l'opération doit être effectuée avec dans un bloc.

   // 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]

Il m'est apparu que c'était la façon d'effectuer la récupération:

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

moc.perform {
    self.results = try! request.execute()
}

Pour ceux qui roulent les leurs

Si vous lancez votre propre code, vous constaterez peut-être que votre code ne se compile pas. Le code généré automatiquement comprend une nouvelle méthode appelée fetchRequest que le compilateur utilise pour transmettre le type. Voici à quoi ressemble le code.

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

Pour i OS 1 (Swift) La manière suivante m'a aidé:

var userRecordsArray: [UserProfile] = []

func getData() {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserProfile")
    let managedContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    do {
        userRecordsArray = try managedContext.fetch(fetchRequest) as! [UserProfile]
    } catch {
        print("Fetching Failed")
    }
}
8
user4886069