【问题标题】:How to use KVO to update properties如何使用 KVO 更新属性
【发布时间】:2013-10-05 06:39:40
【问题描述】:

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

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

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

现在问题来了。 Summary应该如何更新?

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

总结一下,我的问题是:

Q1:我应该让 totalDistance 直接扫描数据库吗?
Q2:我应该使用 KVO 还是委托模式?
Q3:totalDistance 是如何更新的?

【问题讨论】:

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


    【解决方案1】:

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

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

    仅当这不满足您的性能要求时,才考虑使用 KVO 或其他机制来缓存距离值。如果性能可以接受,实时计算总是比缓存更可取。但我很难相信 CoreData 无法处理您一生中可以实际进行的锻炼量。

    【讨论】:

    • 你会以同样的方式解决 iTunes 问题(音乐小时数)吗?
    • 如果我在 CoreData 中拥有所有曲目信息,我一定会尝试的!
    • 而不是使用@sum.distance 技巧。我遍历了每个 Workout.distance 值
    【解决方案2】:

    如果您有很多 Workout 对象并且您正在使用 batchSize 在 tableview 中显示它们,而不是遍历它们,您可以创建一个 NSFetchRequest 在 SQL 级别执行该计算,这应该会显着提高性能和内存.

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

    【讨论】:

    • 博客被删除。
    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多