我的 Core Data 存储中有具有纬度和经度属性的记录。现在我需要找到最接近给定位置的记录。 在 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 中执行此操作。
我能想象到的最糟糕的事情是使用一个谓词循环获取请求,该谓词围绕给定的 (varLat,varLon) 扩展“搜索范围”,并使用
longitude BETWEEN %@ && latitude BETWEEN %@
以 2 个数组(每个数组都有 center+ 和 center- radius 作为数组成员)作为参数,每次都扩大这个范围直到我得到一个命中..然而,这是远非最佳。
感谢您的建议。
最佳答案
首先,您的查询不正确,错误为 up to app. 40%。您的计算只是总结了纬度和经度的差异。假设是 2D 表面,实际差异是 sqrt((lat-varlat)^2 + (lon-varLon)^2)
。在实际表面上,几何形状更复杂,但在大多数情况下差异可以忽略不计。
在 Core Data 中,获取所有实例然后在循环中迭代它们并不少见。原因是 Core Data 使用了一种称为故障的机制,它允许您检索大量对象而无需过多的内存开销。
关于ios - 核心数据 : object with minimum difference between property and variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152410/