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 8 和 Swift 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更新
所以,这就是我为 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
Swift 3 错误:“参数标签 '(named:_:,_:,)' 不匹配任何可用的重载”,同时尝试将 UIImage 数组加载到 UITableView