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

Posted

技术标签:

【中文标题】Swift 3 获取请求错误(警告:无法加载任何 Objective-C 类信息)【英文标题】:Swift 3 Fetch Request Error (warning: could not load any Objective-C class information) 【发布时间】:2016-08-06 03:22:05 【问题描述】:

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

警告:无法加载任何 Objective-C 类信息。这将显着降低可用类型信息的质量。 (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 中的错误?

【问题讨论】:

【参考方案1】:

您不应从ManagedObjectContext 获取结果。如果您想在您的应用程序中使用NSFetchedResultsController 类?您需要访问他们的方法。并且所有必需或可选的方法都来自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()

它应该是有效的。 祝你好运!

自动子类生成

Xcode 8Swift 3 带有称为 Automatic Subclass Generation 的新一代子类!如何创建它?好!所以让我们创建一个新的Xcode 8 项目,选择一个Single View Application,然后会出现另一个窗口,名为Choose options for your new project:。为您的新项目命名,确保语言是 Swift 并选中 Use Core Data 复选框,然后点击 Create

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

选择类定义后,您可以看到名称文本字段自动填充您的实体名称like so。再次转到您的实体并单击它。首先单击Command + S 保存更改,然后单击Command + B 进行重建,就是这样。 自动子类生成已成功创建。

记住

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

创建托管对象

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

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

你可以看到这很容易!如何将值保存到 managedObject ?因此,假设您的模型有一个 title 属性。 title 也是 String

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 beta 和 Xcode 8.0 beta 上运行良好。

【讨论】:

Cannot convert value type 'NSFetchRequest' to expected argument to type 'NSFetchRequest<_>' 我什至试过 request 但返回了这个错误 无法专门化非泛型定义即使在阅读了定义之后,我仍然不清楚 NSFetchRequestResults 是什么。 Swift 3 带有自动子类生成。确保您正确地创建了 NSManagedObject 的子类。 也许您没有从数据模型检查器中检查 Codegen 字段,或者您还没有保存您的员工。 对。我迁移到 Swift 3 (beta) 和 Xcode 8 (beta) 当前语法。我假设我的 xcdatamodel 被考虑了。它和以前一样。我应该重新生成一个 NSManaged 子类吗? 您的数据模型检查器中的 Codegen 字段是什么意思,或者您还没有保存您的员工【参考方案2】:

更新

所以,这就是我为 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)")
    

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

因此,在我的 Profile+CoreDataProperties.swift 中,我复制了 Apple 在创建新项目时在其 Master-Detail 示例中使用的方法:

扩展配置文件

@nonobjc class func fetchRequest() -> NSFetchRequest<Profile> 
    return NSFetchRequest<Profile>(entityName: "Profile");

@NSManaged var title: String?
@NSManaged var titleImage: Data

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

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

【讨论】:

以上是关于Swift 3 获取请求错误(警告:无法加载任何 Objective-C 类信息)的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 内存警告 - 无法加载任何 Objective-C 类信息

FBSDKGRAPHRequestConnection 警告 swift 3

JSON请求后的IOS/Swift渲染表

CoreData:警告:无法加载名为的类

Swift 3 / Alamofire:无法用数据加载表格

Swift 3 错误:“参数标签 '(named:_:,_:,)' 不匹配任何可用的重载”,同时尝试将 UIImage 数组加载到 UITableView