【问题标题】:Core Data: object with minimum difference between property and variable核心数据:属性和变量之间差异最小的对象
【发布时间】:2013-11-22 18:56:53
【问题描述】:

我的核心数据存储中有纬度和经度属性的记录。现在我需要找到离给定位置最近的记录。 在 SQL 中,我会这样做:

select t.lat
      ,t.lon
      ,(t.lat-varLat) + (t.lon - varLon) diff
from table t
order by diff ASC.

给定 varLat 和 varLon 是我想要最接近记录的位置的坐标。但是我不知道如何使用 NSPredicate 在 Core Data 中执行此操作。

我能想象的最糟糕的事情是使用一个谓词循环 fetchrequests,该谓词在给定的 (varLat,varLon) 周围扩展“搜索范围”,并使用 longitude BETWEEN %@ && latitude BETWEEN %@ 有 2 个数组(每个数组都有 center+ 和 center-radius 作为数组成员)作为参数,每次都扩大这个范围直到我得到一个命中。然而,这远非最佳。

感谢您的建议。

【问题讨论】:

    标签: ios objective-c core-data nspredicate nsmanagedobject


    【解决方案1】:

    首先,您的查询不正确,错误最多为 app. 40%。您的计算只是总结了经纬度差异。假设一个二维表面,实际差异是sqrt((lat-varlat)^2 + (lon-varLon)^2)。在实际表面上,几何形状更复杂,但在大多数情况下差异可以忽略不计。

    在 Core Data 中,获取所有实例然后循环遍历它们并不少见。原因是 Core Data 使用了一种称为故障的机制,它允许您检索大量对象而不会产生过多的内存开销。

    【讨论】:

    • 谢谢。没有注意那里的几何方面,你是对的。在这种情况下,我将循环我的对象。谢谢。
    • 我怎么能忘记那个老朋友毕达哥拉斯:-)。感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多