NSAsynchronousFetchResult

NSAsynchronousFetchResult

我正在学习核心数据教程,我的代码抛出了以下错误。
无法将“nsAsynchronousFetchResult”(0x103e13388)类型的值强制转换为“nsArray”(0x10435cf28)。
2018-12-29 22:54:17.619639+0700 democoredata[2670:247527]无法将“nsAsynchronousFetchResult”(0x103e13388)类型的值强制转换为“nsArray”(0x10435cf28)。
(b)
我的问题是:
基于所提供的错误,我的应用程序失败的原因是什么?
以下是我无法编译的代码:

import UIKit
import CoreData

class ViewController: UIViewController {
@IBOutlet weak var txtID: UITextField!
@IBOutlet weak var txtTen: UITextField!
@IBOutlet weak var txtTuoi: UITextField!
@IBOutlet weak var lblKetQua: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}


@IBAction func btnInsert(_ sender: Any) {
    let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate // tạo biến để connect giữa iphone với Manage Object Context
    let context: NSManagedObjectContext = appDel.persistentContainer.viewContext //tạo biến connect với db
    //insert new Khach Hang
    let newKH = NSEntityDescription.insertNewObject(forEntityName: "KhachHang", into: context) //insert new object

    newKH.setValue(Int(txtID.text!), forKey: "id") //forKey = tên column
    newKH.setValue(txtTen.text, forKey: "tenKH")
    newKH.setValue(Int(txtTuoi.text!), forKey: "tuoiKH")

    do {
        try context.save()
        print("Insert Success")
    }catch {
        let err = error as NSError
        print("Error is: \(err)")
    }

}

@IBAction func btnShow(_ sender: Any) {
    let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate // tạo biến để connect giữa iphone với Manage Object Context

    let context: NSManagedObjectContext = appDel.persistentContainer.viewContext // tạo biến connect với db

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "KhachHang")// tạo biến truy vấn đến table "KhachHang"

    request.returnsObjectsAsFaults = false // có trả về những kết quả sai hay ko

    do {
        let results = try context.execute(request)
        print("Truy Van Success")

        for re in results as! [NSManagedObject] {
            print(re.value(forKey: "tenKH"))
        }

    }catch {
        let err = error as NSError
        print("Excute err: \(err)")
    }
}
}

这是我的*.xcdatamodeld文件
https://drive.google.com/open?id=18b1iJYz3jWAFkxYK2V4RrkxCTeWuR5yr
我真正想知道的是,如何独立调查此事。
提前感谢您的帮助!

最佳答案

从你的代码:

    let results = try context.execute(request)

    for re in results as! [NSManagedObject] {
        print(re.value(forKey: "tenKH"))
    }

您使用的execute方法返回NSPersistentStoreResult的实例。这是一个抽象类。错误消息中提到的NSAsynchronousFetchResultNSPersistentStoreResult的具体子类。
接下来,尝试将其转换为[NSManagedObject],这是一个不同的、不相关的类。您看到的错误发生的原因是无法将NSAsynchronousFetchResult类型转换为数组,因为它们彼此不相关,甚至不相似。
看起来您应该使用fetch(request)而不是execute(request),因为fetch返回一个托管对象数组。
我真正想知道的是,如何独自调查这个问题。
我不想提这个问题,但既然你问得很明确:这是你可以通过查看apple的文档来解决的问题,其中包含你正在使用的类和方法。记录了execute方法以返回与代码预期不同的内容,错误消息为问题的性质提供了很大的线索。

10-08 05:45