2016-02-26 43 views
1

我有一個實體在CoreData MyObject它有屬性latitudelongitudeNSSortDescriptor與比較使用實際的對象不是一個鍵值

我想用NSFetchedResultsController執行提取,按MyObject距離用戶當前位置的距離對提取進行排序。

但是,我不知道在排序描述符的Key部分放什麼東西。

我不想比較對象的特定鍵。我想比較它們自己。

我不知道如何在沒有重新填充記錄距離字段的情況下執行此操作。

我想使用此代碼...

[[NSSortDescriptor alloc] initWithKey:@"." ascending:YES comparator:^NSComparisonResult(MyObject *object1, MyObject *opject2) { 
    // stuff here 
}]; 

但它崩潰的應用程序由於內存壓力(笑)。

顯然使用@"."是不正確的,但有沒有辦法做到這一點?

或者有沒有更好的方法使用不同的方法做到這一點?

回答

2

如果您不想按鍵排序對象,而是對對象進行排序,則不應使用排序描述符。只需獲得結果數組然後對該數組進行排序。當然你的自定義對象MyObject應該實現isEqual來完成這個任務。

另一種方法是向MyObject添加一個名爲distance的新密鑰,然後將其用作排序描述符的關鍵字。

  1. 從CoreData
  2. executeFetchRequest的MyObject的實體來獲取數據庫中的所有位置創建NSFetchRequest。
  3. 迭代通的MyObject的陣列和通過計算到distance
  4. 創建FRC的currentLocation和MyObject來的位置之間的距離(緯度,經度)
  5. 設置在1中創建該找取請求的sortDescriptor填充距離屬性使用此獲取請求並致電performFetch
  6. 使用FRC的fetchedObjects,該FRC將按照distance排序。

希望這對你有用。

+0

是的,你的第二個解決方案可能是我要做的。將它們全部排序然後對它們進行排序的問題在於它打破了使用fetchedresults控制器的整個概念。 – Fogmeister

+0

實際上它不是。原因是你必須可能每次計算距離,因爲當前位置可能會改變。所以你將不得不使用'executeFetchRequest'來獲取所有現有的(lat,long)對象。然後遍歷這些對象並填充distance屬性。然後創建一個抓取的結果控制器,並使用距離作爲排序描述符,並在FRC上調用'performFetch'來獲得排序結果的距離 –

+0

啊,我想是的。我要麼更新到核心數據,我必須全部獲取它們或者將它們全部取出然後對它們進行排序。好的,很酷,謝謝 – Fogmeister