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 8和Swift 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
属性。另外 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 测试版和 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)")
}
}
在 viewDidLoad 中,我在 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 的帮助!
我最近在从 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 8和Swift 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
属性。另外 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 测试版和 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)")
}
}
在 viewDidLoad 中,我在 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 的帮助!