如何使用KVO更新属性



我想创建一个应用程序,当我慢跑时记录日志,并使用核心数据来存储信息。我想将每次训练与我跑步的日期、距离和时间一起存储起来。我还希望能够显示一个摘要,其中包含我跑步的总次数和总距离。

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

+---------------------+                    +---------------------+
|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还是委托模式
Q3:totalDistance是如何更新的?

使用最简单的API。假设你有一系列牵强的训练。然后简单地进行

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

只有当这不能满足您的性能要求时,才考虑KVO或其他缓存距离值的机制。如果性能可以接受,实时计算总是比缓存更可取。但我很难相信CoreData无法处理你一生中可以实际完成的训练量。

如果你有很多Workout对象,并且你用batchSize在表视图中显示它们,而不是对它们进行迭代,你可以创建一个NSFetchRequest,它在SQL级别上执行该计算,这应该会显著提高性能和内存。

下面的博客文章中的一个例子http://iphonedevelopment.blogspot.co.il/2010/11/nsexpression.html

最新更新