NSFetchedResultsController -[__NSArrayM insertObject:atIndex:]:对象不能为 nil

Posted

技术标签:

【中文标题】NSFetchedResultsController -[__NSArrayM insertObject:atIndex:]:对象不能为 nil【英文标题】:NSFetchedResultsController -[__NSArrayM insertObject:atIndex:]: object cannot be nil 【发布时间】:2016-02-08 03:28:53 【问题描述】:

我已经对这个问题进行了大量研究,但没有发现任何可以让我找到解决方案的东西。我正在尝试使用NSFetchedResultsController,并在运行应用程序时收到此错误:

* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* -[__NSArrayM insertObject:atIndex:]: object cannot be nil' *** 首先抛出调用栈:

我发现有些人在使用estimatedHeightForRowAtIndexPath方法时遇到了这个问题,但是我没有使用。

使用异常断点显示它在以下代码块中的这一行崩溃:let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedContext, sectionNameKeyPath: "date.theDate", cacheName: nil)。它不会从这里过去。

我在它下面有一个永远不会执行的打印语句。 managedObjectContext 确实存在。 frc 第一次在 viewDidLoad 中被调用(代码如下)。我还将包括我的 AppDelegate 代码。

提前致谢!

这是我的相关代码:

import UIKit
import CoreData

class TransactionsViewController: UIViewController, UITableViewDataSource, NSFetchedResultsControllerDelegate 

    var containerDelegate: ContainerDelegate?

    var managedContext: NSManagedObjectContext!

    lazy var frc: NSFetchedResultsController = 
        // Initialize Fetch Request
        let fetchRequest = NSFetchRequest(entityName: "DailyTransactions")

        // Initialize Fetched Results Controller
        let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedContext, sectionNameKeyPath: "date.theDate", cacheName: nil)

        print("Assigned frc complete.")

        // Configure Fetched Results Controller
        frc.delegate = self

        print("FRC finished")

        return frc
    ()

frc 首先在 viewDidLoad 中使用:

    // Exectue Fetch Request
    do 
        try self.frc.performFetch()
     catch 
        let fetchError = error as NSError
        print("\(fetchError), \(fetchError.userInfo)")
    

更新:

在 Fetch Request 上使用排序描述并将部分键路径更改为 nil 后,我解决了这个问题。我什至可以将部分键路径更改回date.theDate,它会运行良好。

【问题讨论】:

为什么你的排序描述符键是一个空字符串。我不知道那会做什么,但这是不对的。 这是我尝试不同的方法来识别/解决问题时留下的。我已将其从帖子中删除。 您可能会看到另一个问题的副作用。你有一个异常断点吗?这将准确显示导致问题的行。见***.com/questions/13929518/… 你试过没有节名键路径吗? 我使用了异常断点并发现它在这一行崩溃:let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedContext, sectionNameKeyPath: "date.theDate", cacheName: nil)。我也尝试过将 sectionNameKeyPath 设置为 nil,但没有成功。 【参考方案1】:

在 Fetch Request 上使用排序描述并将部分键路径更改为 nil 后,我解决了这个问题。我什至可以将部分密钥路径更改回 date.theDate 并且它会运行良好。我的错误要么在其他地方,要么与 Section 键路径有关。

【讨论】:

【参考方案2】:

您的托管上下文为零。因此你什么也得不到。这就是它没有初始化的原因,应该有一个 context ,否则无法传播对象...

【讨论】:

我的托管上下文是从以前的视图控制器传递过来的。

以上是关于NSFetchedResultsController -[__NSArrayM insertObject:atIndex:]:对象不能为 nil的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?