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