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

时间:2016-03-30 17:48:05

标签: ios core-data nsfetchedresultscontroller

我有这样的数据模型:

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方法在app正在运行时经常被调用(每次 10次 分钟)。

这个频率是因为app正在聊天应用程序,当我们发送任何消息并获得交付状态时,读取状态就会被调用。

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

1 个答案:

答案 0 :(得分:1)

您的代码很危险,因为您不知道您会找到返回的结果,如果您不这样做,您将返回nil和/或尝试打开它。

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

通常,fetch会更好,你的另一个选项需要将所有对象加载到内存中。如果你知道它们已经加载到内存中(没有出现故障)那么循环应该更快......

最后,你现在不应该在意。如果您发现问题,那么您应该根据对一般使用条件和极端情况的分析进行测试。