【问题标题】:NSFetchedResultsController with table like iMessageNSFetchedResultsController 与 iMessage 之类的表
【发布时间】:2016-06-17 06:15:26
【问题描述】:

我有核心数据数据库。结构在图像上(DBContact 有许多属性为messages 的DBMessage,每个DBMessage 有一个属性为contact 的联系人):

我想显示按联系人分组并按日期排序的消息。所以行数必须是 = 有消息的联系人数。在每一行中,我必须显示头像、联系人的姓名和姓氏以及此联系人的最后一条消息的文本和日期。

我找到的唯一解决方案是:

    let entityName = kDBOrder
        let entityDescription = NSEntityDescription.entityForName(entityName, inManagedObjectContext: managedObjectContext)
        let fetchRequest = NSFetchRequest()
        fetchRequest.entity = entityDescription
        fetchRequest.fetchBatchSize = 20
        // sort
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "contact.id", ascending: false), NSSortDescriptor(key: "date", ascending: false)]
        let sectionNameKeyPath: String? = "contact.id"
        self.fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: sectionNameKeyPath, cacheName: nil)
       fetchedResultsController!.delegate = self
       if tableViewMain != nil {
          do {
             try fetchedResultsController!.performFetch()
          } catch {
             print("An error occurred in fetchresultcontroller")
          }
          tableViewMain.reloadData()
       }

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var count = 0
        if let sections = fetchedResultsController?.sections {
            let currentSection = sections[section]
            count = currentSection.numberOfObjects
            // in each section we must have only 1 row
            if count > 0 {
                count = 1
            }
        }
        return count
    }

但在这种情况下,联系人将按 id 排序,但我需要按最后一条消息的日期对它们进行排序。但是,如果我将 sortDescriptors 更改为 fetchRequest.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false), NSSortDescriptor(key: "contact.id", ascending: false)] 以首先按日期排序,它将无法正确显示联系人。 有人知道如何实现吗?

【问题讨论】:

    标签: ios swift core-data nsfetchedresultscontroller nsfetchrequest


    【解决方案1】:

    我可能会更改模型以使生活更轻松,并提前进行更多处理。基本上,如果在 2 个实体之间添加另一个关系(一对一),并且每次添加新消息时都会更新该关系 - 所以你总是有一个指向最新消息的直接指针。

    完成后,您的 FRC 和表加载速度将变得微不足道,因为您只需在 fetch 中使用联系人。新消息也会得到正确处理,因为关系会更新,因此联系人会发生变化,FRC 会看到它。

    【讨论】:

    • 但我需要按日期和订单类型进行过滤,所以这个实现将不起作用。您还有其他建议吗?
    • 订单类型是什么意思?您仍然可以应用使用日期的谓词。
    • 抱歉,不是订单,而是留言。主要问题是按日期过滤。例如,在联系人“Fred”中,我将保存最后一条消息“Hello”,但如果我将日期过滤器从 2 年前更改为 1 年前,则最后一条消息将不相关(相关消息将为“Hello from me 1一年前”),所以这个实现将不起作用。有没有其他方法可以实现这一点。现在我认为,使用 fetchRequest.propertiesToGroupBy = "contact" 可能会更好(但在这种情况下 NSFetchedResultController 的自动更新将不起作用,这就是为什么找到更好的解决方案会很棒)
    • 这是一个完全不同的要求。您需要能够在任意选择的日期查看按消息排序的用户列表吗?那有什么用例?
    • 其实是的,但它不是一个选择的日期,它是一个选择的日期过滤器(所以用户选择“从日期”和“到日期”),我需要这个,因为设计师按日期放置过滤器在消息屏幕上。
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多