2016-05-10 40 views
2

嗨我正在制作一个应用程序,显示我有趣的地方。它显示半径的地方。我正在使用REALM来存储值。 但是,领域不知道如何制作唯一值。我正在使用这个独特的行。Swift REALM - 按距离排序,过滤和存储唯一值

let result:[String] = realm.objects(E21).sorted("name").uniqueValue("Id_prov", type: String.self) 

这寻找我

var datasourceE21Distance:Results<E21> = realm.findInRegion(E21.self, region: curentRegion).filter(tempRequest) 

周围区域的事情,但我不知道如何把这些东西结合为一,然后对它进行排序,从关闭一个给我的最远处。

我会很高兴在这里得到任何帮助。

编辑我使用发现这两个扩展:

func findInRegion<T: Object>(type: T.Type, region: MKCoordinateRegion, latitudeKey: String = "lat", longitudeKey: String = "lng") -> Results<T> { 
    // Query 
    return self 
     .objects(type) 
     .filterGeoBox(region.geoBox, latitudeKey: latitudeKey, longitudeKey: longitudeKey) 

} 

func uniqueValue<U : Equatable>(paramKey: String, type: U.Type)->[U]{ 
    var uniqueValues : [U] = [U]() 
    for obj in self { 

     if let val = obj.valueForKeyPath(paramKey) { 

      if (!uniqueValues.contains(val as! U)) { 
       uniqueValues.append(val as! U) 
      } 
     } 
    } 
    return uniqueValues 
} 

回答

1

RealmGeoQueries,您使用的是由边界框过滤自己的实体库,支持通过sortByDistance排序由远处的物体。这将返回一个数组,因为此操作必须在缓存距离的内存中完成。

您需要确保您的uniqueValue方法在Array的扩展名中定义。

0

我想出了这样的事情。但它不能立即过滤: -/

let currentLocation = CLLocationCoordinate2D(latitude: currentLat!, longitude: currentLng!) 
      sortedObjectsByDistance = realm.findNearby(E21.self, origin: currentLocation, radius: 50000.0, sortAscending: true, latitudeKey: "lat", longitudeKey: "lng") 
      var seenIdProv:[String:Bool] = [:] 
      sortedObjectsByDistance = sortedObjectsByDistance.filter { 
       seenIdProv.updateValue(false, forKey: $0.Id_prov) ?? true 
      }