Как сделать запрос на выборку, используя новую функцию 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.

Вопрос

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

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

2 ответа

Решение

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

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

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

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

Если вы просмотрите подробности 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");
}

Для iOS 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")
    }
}
Другие вопросы по тегам