Swift 3 获取请求错误(警告:无法加载任何 Objective-C class 信息)

Swift 3 Fetch Request Error (warning: could not load any Objective-C class information)

我最近在从 Core Data 获取数据时收到此错误:

警告:无法加载任何 Objective-C class 信息。这将显着降低可用类型信息的质量。 (lldb)

这是我的代码:

// MARK: - Initialize Fetch Request

var fetchedResultsController = NSFetchedResultsController<Profile>()

func setFetchRequest() -> NSFetchRequest<Profile> {

    let request = Profile.fetchRequest()
    let sortDescriptor = SortDescriptor(key: "title", ascending: false)

        do {
            try moc?.fetch(request)
        } catch {
            print("Error With Request: \(error)")
        }
        request.sortDescriptors = [sortDescriptor]

    return setFetchRequest()
}


// MARK: - Retrieve Fetch Request

func getFetchRequest() -> NSFetchedResultsController<Profile> {

    fetchedResultsController = NSFetchedResultsController(fetchRequest: setFetchRequest(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)

    return fetchedResultsController
}

我在 "try moc?.fetch(request)":

的地方遇到了这个错误

线程 1 EXC_BAD_ACCESS(代码=2,地址=0x16fc07feo)

这些错误是否关联,或者这是 Swift 3 / Xcode 8 中的错误?

您不应该从 ManagedObjectContext 中获取结果。如果你想在你的应用程序中使用 NSFetchedResultsController class?您需要访问他们的方法。所有必需或可选的方法都来自 NSFetchedResultsControllerDelegate 协议。

试试这个

class YourTableViewController: UITableViewController, NSFetchedResultsControllerDelegate { var fetchedResultsController:NSFetchedResultsController<Profile>! }

然后像这样创建一个自定义辅助函数:

`func frc() {

    let request:NSFetchRequest<Profile> = Profile.fetchRequest()
    let sorter = SortDescriptor(key: "title", ascending: true)
    request.sortDescriptors = [sorter]

    self.fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
    // make sure the delegate is set to self
    self.fetchedResultsController.delegate = self

    do {
     try self.fetchedResultsController.performFetch()
    } catch {} 
}

`

从现在开始,您将需要一个触发器来执行操作。因此,当您调用 viewDidLoad 方法时,系统本身应该执行此操作,或者您可以创建一个按钮。例如点击按钮开始操作。

override func viewDidLoad() { super.viewDidLoad() self.frc() self.tableView.reloadData() }

应该可以。 祝你好运!

自动子class生成

Xcode 8Swift 3自带新一代子class ing 称为 自动子 class 生成 !如何创建它?出色地!因此,让我们创建一个新的 Xcode 8 项目,选择一个 Single View Application 然后另一个 window 将出现,名为 为您的新项目选择选项:。为您的新项目命名,确保语言是 Swift 并且 Use Core Data 复选框被选中,然后点击 Create .

转到 YourProjectName.xcdatamodeld 文件并单击它。然后添加一个实体!因此,假设您的实体名称是 Profile 并分别创建它们的 Attributes。了解这一点很重要,因为这是 Automatic Subclass Generation。选择您的实体并转到 Data Model Inspector!为 Codegen You can find a Codegen from here 选择一个 Class 定义

select编辑Class定义后,您可以看到名称文本字段由您自动填充实体名称 like so。再次转到您的实体并单击它。先点击Command + S保存修改,然后点击Command + B重建,就这样。 自动子class生成已成功创建。

记得

如果你想改变你的模型?例如:如果你想给你的模型添加一个新的Attribute?很简单,select一个xcdatamodeld文件然后点击你的entity。单击 Attributes 下的加号并添加新的 属性 。您的更改完成后?不要忘记保存更改。再次单击 Command + S 然后单击 Command + B

创建托管对象

Swift 3 中,您可以使用 subclass 初始化程序创建 ManagedObject。实施起来比以往任何时候都容易

let managedObject = Profile(context: self.managedObjectContext!)

可见,非常简单!如何将值保存到 managedObject ?因此,假设您的模型有一个 title 属性。另外 titleString.

managedObject.setValue("Well crafted API? Right?", forKey: "title")

managedObject.title = "Well crafted API? Right?"

保存值:

do { try self.managedObjectContext.save() print(managedObject) } catch {}

它在 Swift 3.0 测试版和 Xcode 8.0 测试版上运行良好。

更新

所以,这就是我为 Xcode 8 beta 和 Swift 3 beta Core Data

工作的结果
var fetchedResultsControler = NSFetchedResultsController<Profile>()

func frc() {

let request: NSFetchRequest<Profile> = Profile.fetchRequest()

let sortDescriptor = SortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]

self.fetchedResultsControler = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.moc!, sectionNameKeyPath: nil, cacheName: nil)

self.fetchedResultsControler.delegate = self

do {
try self.fetchedResultsControler.performFetch()
} catch {
    print("Error Fetching Data: \(error)")
    }
}

在 vi​​ewDidLoad 中,我在 viewDidLoad 的顶部有 self.frc() 。

因此,在我的配置文件+CoreDataProperties.swift 中,我复制了 Apple 在您创建新项目时在他们的 Master-Detail 示例中使用的方法:

扩展配置文件{

@nonobjc class func fetchRequest() -> NSFetchRequest<Profile> {
    return NSFetchRequest<Profile>(entityName: "Profile");
}
@NSManaged var title: String?
@NSManaged var titleImage: Data

}

所以我的获取请求是 "native to my function." 很确定这不是正确的说法,但它帮助我理解发生了什么。 Apple 示例中的获取请求是绿色而不是蓝色。我花了很长时间才注意到这一点。我在 Apple 的示例中单击 "Event",然后很方便地转到创建的子类,这在 WWDC 的 Xcode 8 视频中进行了演示。

例如文件Event.swift 和 Event+CoreDataProperties.swift 不会像在 Xcode 7.x.x 和更早版本中那样公开。你必须点击代码中的实体,然后你就会被带到他们那里。也许那是我的问题?无论如何,我正在像冠军一样获取数据和图像。非常感谢@Mannopson 的帮助!