核心数据计数(for :)比参数计数慢得多
我有两个实体,ManagedEvent
和ManagedEdeventData
:
final class ManagedEvent: NSManagedObject {
@nonobjc
class func fetchRequest() -> NSFetchRequest<ManagedEvent> {
return NSFetchRequest<ManagedEvent>(entityName: "Event")
}
@NSManaged private(set) var name: String
@NSManaged var data: NSOrderedSet?
}
final class ManagedEventData: NSManagedObject {
@nonobjc
class func fetchRequest() -> NSFetchRequest<ManagedEventData> {
return NSFetchRequest<ManagedEventData>(entityName: "EventData")
}
@NSManaged private(set) var id: String
@NSManaged private(set) var createdAt: Date
@NSManaged private(set) var name: String
@NSManaged private(set) var parameters: Data
data
每个MANGEDEDEVENT
的变量是与经常关系ManagedEventData
对象。 name
MANCANEDEVENT
的变量设置为name
ManagedeDeventData
的变量。
现在,我想计算某个名称存在多少ManagedeDeventData
对象。我找到了两种方法,但是一个比另一个方法要慢很多。
第一种方法是这样:
let fetchRequest = ManagedEventData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try mainContext.count(for: fetchRequest)
对于11k takandeDeventData
项目,这将在0.011秒内返回。
另一种方法是首先检索ManagedEvent
,然后通过访问其Data
属性来获取其计数:
let fetchRequest = ManagedEvent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try context.fetch(fetchRequest).first!.data!.count
对于11K ManagedeDeventData
项目,这是更快的速度而且只需要0.002秒。
为什么这是我该如何提高它的速度?第二种方法是否会占用更多内存,因为我要访问数据
?有没有更好的方法来建模这些数据?
I have two entities, ManagedEvent
and ManagedEventData
:
final class ManagedEvent: NSManagedObject {
@nonobjc
class func fetchRequest() -> NSFetchRequest<ManagedEvent> {
return NSFetchRequest<ManagedEvent>(entityName: "Event")
}
@NSManaged private(set) var name: String
@NSManaged var data: NSOrderedSet?
}
final class ManagedEventData: NSManagedObject {
@nonobjc
class func fetchRequest() -> NSFetchRequest<ManagedEventData> {
return NSFetchRequest<ManagedEventData>(entityName: "EventData")
}
@NSManaged private(set) var id: String
@NSManaged private(set) var createdAt: Date
@NSManaged private(set) var name: String
@NSManaged private(set) var parameters: Data
The data
variable of each ManagedEvent
is a to-many relationship of ManagedEventData
objects. The name
variable of ManagedEvent
is set to the name
variable of ManagedEventData
.
Now, I want to count how many ManagedEventData
objects exist for a certain name. I have found two way of doing this, but one is a lot slower than the other.
The first way is like this:
let fetchRequest = ManagedEventData.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try mainContext.count(for: fetchRequest)
For 11k ManagedEventData
items, this returns in 0.011 seconds.
The other way is to first retrieve the ManagedEvent
and then get its count by accessing its data
property:
let fetchRequest = ManagedEvent.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", eventName)
return try context.fetch(fetchRequest).first!.data!.count
For 11k ManagedEventData
items, this is way faster and only takes 0.002 seconds.
Why is this and how can I improve the speed of this even further? Does the second way take up a lot more memory because I'm accessing data
? Is there a better way to model this data?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论