如何使用NSManagedObject的新fetchRequest函数创建获取请求?

Dan*_*ieu 25 core-data nsfetchrequest ios swift3 xcode8-beta2

在iOS 10中,CoreData团队为NSManagedObject添加了一个新的"fetchRequest"方法.它看起来像这样:

public class func fetchRequest() -> NSFetchRequest<NSFetchRequestResult>
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我们可以将其替换为:

let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")
Run Code Online (Sandbox Code Playgroud)

有了这个:

let request = MyEntity.fetchRequest()
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试做出这样一个简单的请求时:

let request = MyEntity.fetchRequest()
do {
    results = try request.execute()
} catch let error {
    print("failed to fetch coffee object: \(error)")
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误域= NSCocoaErrorDomain代码= 134060"(null)"UserInfo = {message =在没有范围内的NSManagedObjectContext的情况下无法获取}

所以,显然错误是说我需要将NSManagedObjectContext带入范围.我一直在寻找示例,但似乎可以找到如何使用新API功能执行请求的完整示例.

使用最新的Core Data API功能,如何进行简单的提取请求?基本问题是如何将NSmanagedObjectCotnext带入范围.

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

Dan*_*ieu 32

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

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

 do {
     results = try moc.fetch(request)
 } catch { // error stuff}
Run Code Online (Sandbox Code Playgroud)

第二种方法,这是在WWDC 2016所示使用名为我们取请求对象上的"执行"功能.

如果您查看有关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]
Run Code Online (Sandbox Code Playgroud)

我突然意识到这是执行抓取的方式:

var moc: NSManagedObjectContext!
let request = MyEntity.fetchRequest()
var results : [MyEntity]

moc.perform {
    self.results = try! request.execute()
}
Run Code Online (Sandbox Code Playgroud)

对于那些自己动手的人

如果您正在编辑自己的代码,您可能会发现您的代码无法编译.自动生成的代码中包含一个名为fetchRequest的新方法,编译器使用该方法传递类型.这是代码的样子.

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


小智 9

对于i OS 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")
    }
}
Run Code Online (Sandbox Code Playgroud)