如何使用KVO更新属性

时间:2012-01-10 11:33:54

标签: objective-c ios core-data delegates key-value-observing

我想创建一个应用程序,当我慢跑并使用Core Data存储信息时记录。我想存储每个锻炼的日期,距离和时间。我还希望能够显示一个摘要,其中包含我要运行的总次数和总跑距。

在我的设计中,我可以直接从Workout对象显示摘要。我跑了多少次只是锻炼对象的数量,我可以总结每个锻炼的距离来获得总跑距。但是,我认为第二次操作成本太高,因为每次我想显示数据时都必须扫描整个数据库(这与iTunes中的问题相同,你想要显示你的音乐总时数)设备)。每次应用午餐时我都可以将这些信息存储在一个属性中,但我想这会导致启动缓慢。因此,我认为我宁愿有2个coredata对象摘要和锻炼:

+---------------------+                    +---------------------+
|Summary              |                    |Workout              |
+---------------------+                    +---------------------+
|totalDistance        | <--------------->> |date                 |
|totalAmountOfWorkouts|                    |distance             |
+---------------------+                    |time                 |
                                           +---------------------+ 

现在问题来了。如何更新摘要?

我可以手动更新totalDistance和totalAmountOfWorkouts。我想实现某种updateWorkout方法,每次创建一个新的Workout时都会触发该方法。但是,我知道Coredata已经具有观察功能,可以告诉我何时插入了新的Workout对象,我可以更新Summary:KVO。我从未使用过KVO,我想知道这是否适合使用KVO?但是,你是怎么做的?实际上KVO是解决此问题的最佳方法,还是我应该在Workout中实现协议并将Summary作为委托分配?我狂野地记得听说KVO模式很难调试。

总结一下,我的问题是:

Q1:我应该让totalDistance直接扫描数据库吗? Q2:我应该使用KVO还是代表模式?
问题3:totalDistance如何更新?

2 个答案:

答案 0 :(得分:1)

使用最简单的API。假设您有一系列获取的锻炼。然后简单地做

float distance = [[fetchedObjects valueForKeyPath: @"@sum.distance"] floatValue]

仅当这不符合您的性能要求时,请考虑使用KVO或其他缓存距离值的机制。如果性能可接受,则实时计算总是优于缓存。但我发现很难相信CoreData无法处理你一生中可以实际做的锻炼量。

答案 1 :(得分:0)

如果您有很多Workout对象,并且您正在使用batchSize在tableview中显示它们,而不是迭代它们,您可以创建一个NSFetchRequest,在SQL级别执行该计算,这应该是明显更好的性能和内存明智

以下博文中的示例 http://iphonedevelopment.blogspot.co.il/2010/11/nsexpression.html