我从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
}
我遇到了这个错误,我有“尝试moc?.fetch(request)”:
线程1 EXC_BAD_ACCESS(代码= 2,地址= 0x16fc07feo)
这些错误是否已连接或者这是Swift 3 / Xcode 8中的错误?
答案 0 :(得分:0)
您不应该从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 带有新一代子类,称为自动子类生成!如何创建它?好!因此,让我们创建一个新的 Xcode 8项目,选择一个单一视图应用程序,然后会出现另一个名为的窗口为您的新项目选择选项:< / em>的。为新项目命名,确保语言为Swift,并选中使用核心数据复选框,然后点击创建。
转到YourProjectName.xcdatamodeld
文件并单击它。然后添加一个实体!因此,假设您的实体名称是配置文件,并分别创建其属性。知道这一点非常重要,因为这是一个自动子类生成。选择您的实体并转到数据模型检查器!为Codegen
You can find a Codegen from here选择类定义。
选择类定义后,您可以看到由您的实体名称like so自动填充的名称文本字段。再次转到您的实体并单击它。首先单击 Command + S 进行保存更改,然后单击 Command + B 进行重建,以便进行重建。 自动创建子类已成功创建。
<强>记住强>
如果您想更改型号?例如:如果要为模型添加新的属性?这很简单,选择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 测试版和 Xcode 8.0 测试版中运行良好。
答案 1 :(得分:0)
<强>更新强>
所以,这就是我为Xcode 8 beta和Swift 3 beta核心数据工作的原因
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
}
这样我的获取请求就是我的功能本身。&#34;很确定这不是正确的说法,但它帮助我理解发生了什么。 Apple的例子中的获取请求是绿色而不是蓝色。我花了很长时间才注意到这一点。我点击了&#34; Event&#34;在Apple的例子中,它被方便地带到创建的子类中,这在WWDC的Xcode 8视频中得到了证明。
例如,文件Event.swift和Event + CoreDataProperties.swift不像它们在Xcode 7.x.x及更早版本中那样公开。您必须单击代码中的实体,然后才能将它们带到它们中。也许那是我的问题?无论如何,我像冠军一样获取数据和图像。非常感谢你的帮助@Mannopson!