我有这样的数据模型:
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正在聊天应用程序,当我们发送任何消息并获得交付状态时,读取状态就会被调用。
由于用户可以在一分钟内频繁发送消息,因此可以经常调用此方法。
答案 0 :(得分:1)
您的代码很危险,因为您不知道您会找到返回的结果,如果您不这样做,您将返回nil和/或尝试打开它。
在某些方面,效率取决于数据库的大小,对话中有多少消息以及已经将多少消息加载到内存中。
通常,fetch会更好,你的另一个选项需要将所有对象加载到内存中。如果你知道它们已经加载到内存中(没有出现故障)那么循环应该更快......
最后,你现在不应该在意。如果您发现问题,那么您应该根据对一般使用条件和极端情况的分析进行测试。