Ios 难以在Swift 3中配置NSFetchedResultsController
我正在将现有项目从Swift 2重构为Swift 3。在我开始重构核心数据之前,一切都很简单。我能够创建托管对象并将它们持久保存在Ios 难以在Swift 3中配置NSFetchedResultsController,ios,swift,core-data,nsfetchedresultscontroller,swift3,Ios,Swift,Core Data,Nsfetchedresultscontroller,Swift3,我正在将现有项目从Swift 2重构为Swift 3。在我开始重构核心数据之前,一切都很简单。我能够创建托管对象并将它们持久保存在managedObjectContext中,但我很难让NSFetchedResultsController正常工作。我看了一眼,但这并不能让我越过终点线 从JSON导入记录后,我用以下代码验证我的managedObjectContext中是否存在对象: func recordCount() -> Int { let context = (UIApplic
managedObjectContext
中,但我很难让NSFetchedResultsController
正常工作。我看了一眼,但这并不能让我越过终点线
从JSON导入记录后,我用以下代码验证我的managedObjectContext
中是否存在对象:
func recordCount() -> Int {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "MyEntity")
let count = try! context.count(for: fetchRequest)
return count
}
此代码不会崩溃,但不会从fetchRequest返回任何记录。我能够通过谓词中的输入错误强制崩溃,但如果没有输入错误,则不会返回任何对象,尽管对象与谓词匹配
我欢迎任何关于我的错误在哪里的建议。我知道这对我来说将是一个令人吃惊的愚蠢疏忽,我可以放心。感谢阅读。您的NSFetchRequest应该有一个类型
NSFetchRequest
,但是您指定了NSFetchRequest
。请尝试更改此选项,并让我知道它是否有用请检查以下NSFetchedResultsController swift 3的代码
override func viewDidLoad() {
super.viewDidLoad()
do {
try self.fetchedResultsController.performFetch()
} catch {
let fetchError = error as NSError
print("Unable to Perform Fetch Request")
print("\(fetchError), \(fetchError.localizedDescription)")
}
}
//MARK:-NSFetchedResultsController
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> = {
let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD")
fetchRequest.sortDescriptors = [
NSSortDescriptor(key: "name", ascending: true)]
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
try! fetchedResultsController.performFetch()
fetchedResultsController.delegate = self
if let quotes = fetchedResultsController.fetchedObjects {
if quotes.count > 0 {
print(quotes.count)
}
}
return fetchedResultsController
}()
// MARK: - NSFetchedResultsController delegate methods
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.reloadData()
}
fileprivate惰性变量fetchedResultsController:NSFetchedResultsController={
let fetchRequest=NSFetchRequest(entityName:“UserExistenceOnXMPPCD”)
fetchRequest.sortDescriptors=[
NSSortDescriptor(键:“名称”,升序:true)]
让fetchedResultsController=NSFetchedResultsController(fetchRequest:fetchRequest,managedObjectContext:CoreDataController.sharedInstance.managedObjectContext,sectionNameKeyPath:nil,cacheName:nil)
试试!fetchedResultsController.performFetch()
fetchedResultsController.delegate=self
如果let quotes=fetchedResultsController.fetchedObject{
如果quotes.count>0{
打印(引号.计数)
}
}
返回获取的ResultsController
}()
//MARK:-NSFetchedResultsController委托方法
func controllerWillChangeContent(\ucontroller:NSFetchedResultsController){
tableView.beginUpdate()
}
func controllerDidChangeContent(\控制器:NSFetchedResultsController){
tableView.reloadData()
}
显而易见的问题似乎是,您是否确定谓词与您保存的任何对象匹配?您的recordCount
方法不使用谓词,但您的“获取结果”控制器使用谓词,因此如果没有与谓词匹配的内容,则将找不到任何内容。@TomHarrington感谢您的阅读。我的第一个想法也是一个谓词问题。我已将工作代码从Swift 2项目复制到此项目(将语法更新为Swift 3),并在Swift 3项目的托管对象上保持了相同的属性名称,这让我觉得我在配置FRC时遇到了一个问题。是的,但是你知道一些关于数据的信息,这些信息可以让你确定一些对象与谓词匹配吗?如果没有匹配项,则等效代码是无关的。
fileprivate lazy var fetchedResultsController: NSFetchedResultsController<UserExistenceOnXMPPCD> = {
let fetchRequest = NSFetchRequest<UserExistenceOnXMPPCD>(entityName: "UserExistenceOnXMPPCD")
fetchRequest.sortDescriptors = [
NSSortDescriptor(key: "name", ascending: true)]
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:CoreDataController.sharedInstance.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
try! fetchedResultsController.performFetch()
fetchedResultsController.delegate = self
if let quotes = fetchedResultsController.fetchedObjects {
if quotes.count > 0 {
print(quotes.count)
}
}
return fetchedResultsController
}()
// MARK: - NSFetchedResultsController delegate methods
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.reloadData()
}