如何使用 NSManagedObject 的新 fetchRequest 函数发出获取请求?
How do I make a fetch request using NSManagedObject's new fetchRequest function?
在 iOS10 中,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)")
}
我收到以下错误:
Error Domain=NSCocoaErrorDomain Code=134060 "(null)"
UserInfo={message=Cannot fetch without an NSManagedObjectContext in
scope}
所以,很明显错误表明我需要将 NSManagedObjectContext 引入范围。我一直在寻找示例,但似乎可以找到有关如何使用新的 API 功能执行请求的完整示例。
问题
使用最新的 Core Data API 功能,如何发出简单的获取请求?潜在的问题是如何将我的 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 的新方法,编译器使用它来传递类型。代码如下所示。
@nonobjc public class func fetchRequest() -> NSFetchRequest<MyEntity> {
return NSFetchRequest<MyEntity>(entityName: "MyEntity");
}
For 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")
}
}
在 iOS10 中,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)")
}
我收到以下错误:
Error Domain=NSCocoaErrorDomain Code=134060 "(null)" UserInfo={message=Cannot fetch without an NSManagedObjectContext in scope}
所以,很明显错误表明我需要将 NSManagedObjectContext 引入范围。我一直在寻找示例,但似乎可以找到有关如何使用新的 API 功能执行请求的完整示例。
问题
使用最新的 Core Data API 功能,如何发出简单的获取请求?潜在的问题是如何将我的 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 的新方法,编译器使用它来传递类型。代码如下所示。
@nonobjc public class func fetchRequest() -> NSFetchRequest<MyEntity> {
return NSFetchRequest<MyEntity>(entityName: "MyEntity");
}
For 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")
}
}