从一对多关系核心数据中获取单个实体 iOS

Fetching single entity from to-many relationship core data iOS

我有这样的数据模型:

Conversation<---->>Message

我已经创建了上述两个实体的 类 作为:

Conversation {
    @NSManaged var messages: NSSet?
}

我有 Conversation 的对象,我正在使用 NSFetchedResultsController 获取所有对话并在屏幕上显示它们。

如果我想从该对话中获取特定消息,那么哪种方式会更好

(我在 Conversation 中有获取特定消息的方法,下面是方法的内容)

1 个获取请求

func getParticularMessage(uid: String) -> Message {
    let pred = NSPredicate(format: "conversation == %@ AND uid == %@", self, uid)
    let entity = NSEntityDescription.entityForName("Message", inManagedObjectContext: moc)
    let fetchRequest = NSFetchRequest()
    fetchRequest.entity = entity!
    fetchRequest.predicate = pred

    do{
        let results = try moc.executeFetchRequest(fetchRequest)
        return results.first as! Message
    } catch {
        let resultError = error as NSError
        DDLogError(resultError.localizedDescription)
    }

}

2 遍历 NSSet

func getParticularMessage(uid: String) -> Message {
    for msg in messages {
      let singleMsg = msg as! Message
      if singleMsg.uid == uid {
         //this is the message which we want
         return singleMsg
      }
    }
}

更新

假设此 getParticularMessage 方法被调用得非常频繁(每 分钟 10 次),而应用 运行.

这个频率是因为应用程序是聊天应用程序,当我们发送任何消息并获取传递状态时,它会调用读取状态。

由于用户可以在一分钟内频繁发送消息,因此该方法会被频繁调用。

您的代码很危险,因为您不知道您会找到 return 的结果,否则您将 return 为 nil 和/或尝试解包它。

在某些方面,效率取决于数据库的大小、会话中有多少消息以及其中有多少已加载到内存中。

通常提取会更好,您的其他选项需要将所有对象加载到内存中。如果您知道它们已经加载到内存中(没有错误),那么循环应该更快...

最后,您现在不应该在意。如果您观察到一个问题,那么您应该根据对一般使用条件和极端情况的分析进行测试以找出答案。