iPhone CoreData 属性:对 managedObjects 的更改太慢

Posted

技术标签:

【中文标题】iPhone CoreData 属性:对 managedObjects 的更改太慢【英文标题】:iPhone CoreData properties: changes to managedObjects are too slow 【发布时间】:2010-08-29 17:03:12 【问题描述】:

我的 iPhone 应用程序中有一个 CoreData 模型,该模型链接到具有超过 50k 条记录的 SQL 数据库。当我生成记录类时,Xcode 对属性使用 @dynamic 指令。我有一个名为“ISFAV”的属性,NSNumber 类型(CoreData 不使用 BOOL 或 Integer,它使用对象类型)。简而言之,当用户以这种方式点击按钮时,我会更改 ISFAV 属性:

 if (![record.ISFAV intValue]) 

record.ISFAV=[NSNumber numberWithInt:1];

否则 record.ISFAV=[NSNumber numberWithInt:0];

很简单。但是如果我尝试在同一个按钮上连续点击多次,iPhone 会花费太多时间(按钮保持在保持状态的时间会逐渐增加)。即使我更改记录,按顺序从收藏夹中添加\删除许多记录(而不是从收藏夹中添加\删除相同的记录),也会发生这种情况。

如果我把原来的访问器方法改成@synthesize,问题似乎就解决了。

CoreData 中的访问器方法使用 synthesize 指令是否正确?

非常感谢!

@编辑 使用 synthesize 指令,当我保存上下文时不会对 CoreData 模型进行任何更改:-\ 问题仍未解决:-\

【问题讨论】:

你有没有弄清楚你的问题是什么?我也在处理大量的实体和关系,设置一个简单的 BOOL 属性会将 UI 锁定大约半秒,这是不可接受的。正如您所说,将属性更改为@synthesize 确实可以加快速度,但这根本不是解决方案。我很想知道你是否有运气? 【参考方案1】:

@dynamic 是一个标志,它只是告诉编译器该方法将在运行时存在并且现在不发出警告。您不应该将 @synthesize 与 Core Data 属性一起使用。

通过设置 Core Data 属性,您如何知道您的热点?你分析过代码吗?根据我的经验,更改 Core Data 中的一个属性不会很慢,它会是 1/1000 秒或更快。每次更改该属性时是否都保存到磁盘?你在通话中做其他事情吗?

我会首先分析代码并找出热点的真正位置。使用仪器并确认。

【讨论】:

以上是关于iPhone CoreData 属性:对 managedObjects 的更改太慢的主要内容,如果未能解决你的问题,请参考以下文章

核心数据对现有项目 iphone 的影响

CSV 到 CoreData

iphone coredata 获取请求排序

CoreData SQLite 保护

核心数据独特属性

iphone - coredata 应用程序目录