我如何使用NSManagedObject的新fetchRequest函数进行提取请求?

在iOS 10中,CoreData团队向NSManagedObject添加了一个新的“fetchRequest”方法。 它看起来像这样:

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代码= 134060“(空)”UserInfo = {消息=不能获取没有一个NSManagedObjectContext范围内}

所以,显然这个错误是说我需要把一个NSManagedObjectContext带入作用域。 我一直在寻找例子,但似乎find了如何使用新的APIfunction执行请求的完整示例。

使用最新的Core Data APIfunction,我如何进行简单的获取请求? 根本的问题是如何将我的NSmanagedObjectCotnext进入范围。

我应该注意到,我能够使用传统的语法成功地发出请求。

好吧,我想出了两种方法来做这件事。 第一种方法 ,类似于我的示例代码,只是简单的:

 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的新方法,编译器用它来传递types。 这是代码的样子。

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

对于我OS 10斯威夫特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") } }