Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 难以在Swift 3中配置NSFetchedResultsController_Ios_Swift_Core Data_Nsfetchedresultscontroller_Swift3 - Fatal编程技术网

Ios 难以在Swift 3中配置NSFetchedResultsController

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

我正在将现有项目从Swift 2重构为Swift 3。在我开始重构核心数据之前,一切都很简单。我能够创建托管对象并将它们持久保存在
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()
}