2016-01-27 26 views
0

因此,我有一個包含緯度和經度值的點的數據集,我想檢索它們並按照距離用戶當前位置進行排序。目前,我有以下內容:按計算結果對NSFetchRequest進行排序

mainMoc.performBlockAndWait { 
      // Fetching data from CoreData 
      let fetchRequest = NSFetchRequest() 
      fetchRequest.predicate = NSPredicate(format: "pointLatitude BETWEEN {%f,%f} AND pointLongitude BETWEEN {%f,%f}", (latitude-0.03), (latitude+0.03), (longitude-0.03), (longitude+0.03)) 
      let entity = NSEntityDescription.entityForName("PointPrimary", inManagedObjectContext: self.mainMoc) 
      fetchRequest.entity = entity 

      let sortDescriptor = NSSortDescriptor(key: "pointTitle", ascending: false) 
      fetchRequest.sortDescriptors = [sortDescriptor] 

      do { 
       points = try self.mainMoc.executeFetchRequest(fetchRequest) as! [PointPrimary] 

      } catch { 
       let jsonError = error as NSError 
       NSLog("\(jsonError), \(jsonError.localizedDescription)") 
       abort() 
      } 
     } 

所以目前我只是根據標題進行排序。但是,如果我想要計算距離來說CLLocationCoordinate2D並基於該距離對fetchRequest結果進行排序,我將如何繼續?

非常感謝!

回答

0

這應該起作用。基本上你會使用自定義比較器的NSSortDescriptor

訣竅是使用"self"作爲NSSortDescriptor的關鍵字,它會將獲取的對象傳遞到比較器中。

var userLocation : CLLocation // get that from somewhere 
var distanceCompare : NSComparator = { 
    (obj1: AnyObject!, obj2: AnyObject!) -> NSComparisonResult in 
    let lng1 = obj1.valueForKey("pointLongitude") as! CLLocationDegrees 
    let lat1 = obj1.valueForKey("pointLatitude") as! CLLocationDegrees 
    let p1Location : CLLocation = CLLocation(latitude: lat1, longitude: lng1) 
    let p1DistanceToUserLocation = userLocation.distanceFromLocation(p1Location) 

    let lng2 = obj2.valueForKey("pointLongitude") as! CLLocationDegrees 
    let lat2 = obj2.valueForKey("pointLatitude") as! CLLocationDegrees 
    let p2Location : CLLocation = CLLocation(latitude: lat1, longitude: lng1) 
    let p2DistanceToUserLocation = userLocation.distanceFromLocation(p2Location) 

    if (p1DistanceToUserLocation > p2DistanceToUserLocation) { 
     return .OrderedDescending 
    } else if (p1DistanceToUserLocation < p2DistanceToUserLocation) { 
     return .OrderedAscending 
    } else { 
     return .OrderedSame 
    } 
} 

var distanceSortDescriptor = NSSortDescriptor(key: "self", ascending: true, comparator: distanceCompare) 
fetchRequest.sortDescriptors = [distanceSortDescriptor] 
0

NSFetchRequest不能使用比在模型中定義(並存儲在數據庫中)的排序描述符等特性,所以你必須訴諸於內存中的排序。在您的PointPrimary類中定義一個distance方法,該類執行相應的計算,並執行以下操作:

let sortedPoints = points.sortedArrayUsingDescriptors([NSSortDescriptor(key: "distance", ascending: true)])