ios - 如何使用 NSManagedObject 的新 fetchRequest 函数发出获取请求?

标签 ios core-data nsfetchrequest swift3 xcode8-beta2

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

我收到以下错误:

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 的详细信息,您会看到一条注释,该注释清楚地表明必须在 block 中执行该操作。

   // 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 - 如何使用 NSManagedObject 的新 fetchRequest 函数发出获取请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38387125/

相关文章:

ios - Core Data "The Database appears corrupt"——是什么导致了这个错误?

iphone - 嵌套树结构中的核心数据获取请求

iOS,仅对应用程序功能的一部分使用生物识别身份验证

ios - 使用 Core Image iOs 进行人脸检测

ios - 如何在swift中解压ftp下载的数据

c# - Xamarin.iOS 上的蓝牙请求权限

objective-c - NSPredicate 检索某个对象

ios - 在 NSManagedObject 上调用 MR_createEntity 时出错

iphone - 没有排序描述符的 NSFetchRequest

iphone - 核心数据 - NSPredicate 过滤对多关系