当前位置: 首页 > 面试题库 >

NSFetchedResultsController仅在控制器将要插入另一节时才将同一单元格插入两节中

聂宜
2023-03-14
问题内容

这是我的Message.swift文件:

@objc(Message)
class Message: NSManagedObject {

    @NSManaged var content: String
    @NSManaged var createdAt: NSDate
    @NSManaged var identifier: Int64

    @NSManaged var conversation: Conversation

    @NSManaged var sender: Contributor

    var normalizedCreatedAt: NSDate {
        return createdAt.dateWithDayMonthAndYearComponents()!
    }
}

这是我设置FRC的方式:

private func setupFetchedResultsController() {

    let context = NSManagedObjectContext.MR_defaultContext()
    let fetchRequest = NSFetchRequest(entityName: "Message")
    let createdAtDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)

    fetchRequest.predicate = NSPredicate(format: "conversation.identifier = %lld", conversation.identifier)
    fetchRequest.sortDescriptors = [createdAtDescriptor]

    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "normalizedCreatedAt", cacheName: nil)
    fetchedResultsController.delegate = self

    try! fetchedResultsController.performFetch()
    tableView.reloadData()
}

与它的标准代表。

viewDidLoad我的控制器上有1节和1行。我使用以下功能在控制台上打印它:

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    print("--->>>")
    print(section)
    print(fetchedResultsController.sections![section].objects!.count)
    return fetchedResultsController.sections![section].objects!.count
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return fetchedResultsController?.sections?.count ?? 0
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let message = fetchedResultsController?.objectAtIndexPath(indexPath) as! Message
    let cellIdentifier = message.sender.identifier == Settings.currentUser?.profile?.identifier ? SentTableViewCellIdentifier : ReceivedTableViewCellIdentifier
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! TableViewCell

    cell.cellTitleLabel?.text = message.content

    return cell
}

输出如下:

--->>>
0
1

一旦我尝试只添加一条带有不同部分的其他消息,就会得到以下消息:

--->>>
0
2
--->>>
1
1

然后是错误:

CoreData:错误:严重的应用程序错误。在调用-
controllerDidChangeContent:期间,从NSFetchedResultsController的委托捕获了一个异常。无效的更新:第0节中的行数无效。更新(2)之后,现有节中包含的行数必须等于更新(1)之前该节中包含的行数。从该部分插入或删除的行数(已插入0,已删除0),加上或减去移入或移出该部分的行数(移入0,移出0)。与userInfo(空)

为什么会这样呢?

NSFetchedResultsController由于某种原因,将同一个单元格装入两个部分: firstsecond 。为什么?

注意:

  • 仅在FRC插入新节时才会出现此问题。如果需要在现有部分中插入行,则没有问题。问题与章节有关。
  • 仅当FRC尝试插入第二个部分时,问题才出现。当大约是第三或第四部分时,根本没有问题。

问题答案:

我不知道为什么,但是要使其正常工作,您需要更换:

fetchedResultsController.sections![section].objects!.count

fetchedResultsController.sections![section].numberOfObjects

由于某种原因,objects!.count返回与属性相反的对象数量 不正确numberOfObjects



 类似资料:
  • 问题内容: 这是场景: 我正在尝试在插入表时创建引用记录。但是我得到的是null,因为它是自动从序列中生成的。我也尝试了触发器插入,但是结果是一样的。有什么办法解决吗? 问题答案: 避免使用规则,因为它们会再次咬住您。 在每行运行的表a上使用after触发器。它看起来应该像这样(未经测试):

  • 批量订单 Purchorder 我已经试了一个星期了。我有这两个表,batchporder和purchord在batchporder表中,我需要插入一行,并获得传递给purchord插入的主id。在purchord中,我需要插入多行,因此我使用了insert\u batch。 控制器 模型 错误1 遇到PHP错误严重性:警告 消息:array_keys()要求参数1为数组,字符串为给定值 文件名:

  • 如何在同一表中从一列插入值到另一列? 说我有: 我要求: 换句话说,我想复制'Suburb2'和'Date',并将它们分别作为新行插入'Date'和'suburban'。 我知道我可以通过首先复制到临时列/s并稍后清理来实现这一点,但我想知道是否有一种方法可以在一个查询中实现这一点? 我试过了 但得到的列“日期”不存在错误。

  • 在spring mvc项目中,我想将@控制器注入到另一个bean中,如下所示: 这似乎不起作用,尽管@控制器注释是@组件的一种专门化,就像@服务(确实起作用)一样: 我还尝试直接从Application Context获取bean。 我希望避免讨论我为什么要注入控制器,以及我应该创建一个额外的抽象级别并注入它:)

  • 问题内容: 我正在一个有两个秒和两个秒的项目上,当用户按下按钮时,第一个中的数据应该进入,第二个中的数据进入第二个。我的问题是,我不知道每次用户按下按钮时都如何放置数据,我知道如何插入数据,但是据我所知,这种方法只能工作一次。那么,每当用户按下按钮时,我可以使用哪种方法来更新? 问题答案: 单击按钮时,使用和插入新单元格。 首先将数据追加到tableview数组中 然后更新表格并插入新行 这将插入

  • 问题内容: 我是Angular的新手,正在尝试弄清楚该怎么做… 使用AngularJS,如何注入要在另一个控制器中使用的控制器? 我有以下片段: 执行此操作时,出现错误: 我是否应该尝试在另一个控制器内部使用一个控制器,还是应该将此服务用作服务? 问题答案: 如果您打算掌握已经实例化的另一个组件的控制器,并且如果您遵循的是基于组件/指令的方法,则始终可以遵循某个层次结构的另一个组件中的控制器(一个