核心数据:属性和变量之间差异最小的对象



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

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

给定varLat和varLon是我想要的最接近记录的位置的坐标。然而,我不知道如何在核心数据中使用NSPredcate来做到这一点。

我能想象的最糟糕的事情是用一个谓词循环fetchrequests,该谓词围绕给定的(varLat,varLon)扩展"搜索范围",并使用longitude BETWEEN %@ && latitude BETWEEN %@,有两个数组(每个数组都有作为数组成员的中心+和中心-半径)作为参数,每次都扩大这个范围,直到我命中为止。。然而,这远不是最佳的。

谢谢你的建议。

首先,您的查询不正确,错误高达app。40%。你的计算只是把长短差加起来。假设为2D曲面,实际差异为sqrt((lat-varlat)^2 + (lon-varLon)^2)。在实际表面上,几何结构更为复杂,但在大多数情况下,差异可以忽略不计。

在核心数据中,获取所有实例,然后在循环中对它们进行迭代并不罕见。原因是Core Data使用了一种称为faulting的机制,该机制允许您在没有太多内存开销的情况下检索大量对象。

最新更新