2012-01-10 55 views
1

我想创建一个应用程序,该应用程序在我慢跑并使用Core Data存储信息时进行记录。我想存储每次锻炼的日期,距离和跑步时间。我也希望能够显示一个摘要,其中包含我已经运行的总次数和总运行距离。如何使用KVO更新属性

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

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

现在,它来了这个问题。如何更新摘要?

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

汇总,我的问题是:

Q1:我应该得到totalDistance直接扫描数据库?问题12:我应该使用KVO还是委托模式?
问题3:totalDistance如何更新?

回答

1

使用最简单的API。假设您有一组获取的锻炼。那么只需做

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

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

+0

你会以同样的方式解决问题的iTunes(小时的音乐量)的例子吗? – Alvaro 2012-01-10 14:44:05

+0

如果我有CoreData中的所有跟踪信息,我肯定会试试! – 2012-01-10 15:58:04

+0

而不是执行@ sum.distance技巧。我遍历每个Workout.distance值 – Alvaro 2012-01-10 21:01:01