Как сделать запрос на выборку, используя новую функцию fetchRequest NSManagedObject?

В iOS 10 команда CoreData добавила новый метод fetchRequest в NSManagedObject. Это выглядит так:

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

Что из того, что я понимаю, позволяет нам заменить это:

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

с этим:

let request = MyEntity.fetchRequest()

Однако, когда я пытаюсь сделать простой запрос следующим образом:

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

Я получаю следующую ошибку:

Ошибка домена = NSCocoaErrorDomain Code = 134060 "(null)" UserInfo = {message = Не удается получить без NSManagedObjectContext в Объем}

Итак, очевидно, что ошибка заключается в том, что мне нужно привести NSManagedObjectContext в область видимости. Я искал примеры, но могу найти полный пример того, как выполнить запрос, используя новые функции API.

Вопрос

Используя новейшие функции API Core Data, как мне сделать простой запрос на выборку? Основной вопрос заключается в том, как принести свой NSmanagedObjectCotnext в область видимости.

Я должен отметить, что я могу успешно сделать запрос с использованием традиционного синтаксиса.

Ответ 1

Хорошо, я понял два способа сделать это. первый подход, который похож на мой примерный код, просто:

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

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

второй подход, который был показан в WWDC 2016, использует функцию "выполнить" в нашем объекте запроса на выборку.

Если вы просмотрите детали в NSFetchRequest, вы увидите комментарий, в котором четко указывается, что операция должна выполняться в блоке.

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

Мне стало ясно, что это способ выполнить выборку:

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

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

Для тех, кто сканирует свои собственные

Если вы загружаете свой собственный код, вы можете обнаружить, что ваш код не компилируется. Включенный в автоматически сгенерированный код - это новый метод, называемый fetchRequest, который использует компилятор для передачи типа. Вот как выглядит код.

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

Ответ 2

Для я OS 10 (Swift 3) Следующим способом помог мне:

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")
    }
}