Ios 如何使用NSManagedObject';新的fetchRequest函数?

Ios 如何使用NSManagedObject';新的fetchRequest函数?,ios,core-data,nsfetchrequest,swift3,xcode8-beta2,Ios,Core Data,Nsfetchrequest,Swift3,Xcode8 Beta2,在iOS 10中,CoreData团队向NSManagedObject添加了一个新的“fetchRequest”方法。看起来是这样的: public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult> let request = MyEntity.fetchRequest() do { results = try request.execute() } catch let error {

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

public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
let request = MyEntity.fetchRequest()
do {
    results = try request.execute()
} catch let error {
    print("failed to fetch coffee object: \(error)")
}
但是,当我尝试提出这样一个简单的请求时:

public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
let request = MyEntity.fetchRequest()
do {
    results = try request.execute()
} catch let error {
    print("failed to fetch coffee object: \(error)")
}
我收到以下错误:

错误域=NSCOCAERRORDOMAIN代码=134060“(空)” UserInfo={message=在没有NSManagedObjectContext的情况下无法获取 范围}

因此,很明显,错误是我需要将NSManagedObjectContext引入范围。我一直在寻找示例,但似乎可以找到如何使用新API功能执行请求的完整示例

问题: 使用最新的核心数据API功能,如何发出简单的获取请求?根本问题是如何将我的NSManagedObjectCoNext纳入范围


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

好的,我想出了两种方法。与我的示例代码类似的第一种方法是:

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");
}
@nonobjc公共类func fetchRequest()->NSFetchRequest{
返回NSFetchRequest(entityName:“MyEntity”);
}

对于iOS 10Swift 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")
    }
}
var userRecordsArray:[UserProfile]=[]
func getData(){
let fetchRequest=NSFetchRequest(entityName:“UserProfile”)
让managedContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
做{
userRecordsArray=尝试managedContext.fetch(fetchRequest)as![UserProfile]
}抓住{
打印(“提取失败”)
}
}

在核心数据中有了新的通用声明,
as向下转换您正在执行的操作已不再必要--获取的结果应该已经具有类型
[MyEntity]
。嘿,tom,我一定是做错了什么,因为编译器正在强制我向下转换。我会分享一张照片。不确定。结果是一个类型为
[Event]?
的数组,在这里我可以按名称查找属性。嘿@TomHarrington我找到了它,我从生成的代码中删除了nonobjc类func fetchRequest()。一旦我把它加回去,错误就消失了。谢谢你指出这一点…好发现。有趣的是,代码在没有它的情况下工作。