0

我正在使用NSFetchedResultsController來檢索UITableView的數據。它工作正常。現在我需要放置三個按鈕,這些按鈕應該在桌子視圖上觸發不同的排序。爲了實現這一點,我實施了:使用NSFetchedResultsController排序的問題

switch (selectedOrder) { 
    case 0: 
     sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
     break; 
    case 1: 
     /* 
     sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price" ascending: NO 
                comparator: ^(id obj1, id obj2) { 
                 NSLog(@"Test"); 
                 return numSort(obj1, obj2, nil); 
                 //return NSOrderedSame; 
                }]; 
     */ 
     sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @"price" 
                ascending: NO 
                 selector:@selector(compareAsFloats:)]; 

     break; 
    ... 
    default: 
     break;} 

我似乎沒有找到方法來獲得第二個案例(價格)工作。實際上,如果我使用這個塊,它會考慮到這個屬性,但是作爲一個字符串,而不是一個數字。這就像塊中的代碼根本沒有執行過。事實上,如果我只是返回NSOrderedSame,它仍然會將它命令爲一個字符串。並且日誌不被執行。如果我使用@selector(compareAsFloats :)版本,該方法是對的NSString類定義,我得到一個運行時錯誤:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unsupported NSSortDescriptor selector: compareAsFloats:' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x014df5a9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x01889313 objc_exception_throw + 44 
    2 CoreData       0x01211266 -[NSSQLGenerator newSQLStatementForFetchRequest:ignoreInheritance:countOnly:nestingLevel:] + 1270 
    3 CoreData       0x011494d8 -[NSSQLAdapter _newSelectStatementWithFetchRequest:ignoreInheritance:] + 488 
    4 CoreData       0x011492e1 -[NSSQLAdapter newSelectStatementWithFetchRequest:] + 49 
    5 CoreData       0x0114918e -[NSSQLCore newRowsForFetchPlan:] + 430 
    ..... ..... 
) 

我必須做出一個很瑣碎的錯誤。 謝謝你的幫助。

回答

-1

我完成這個的方式是通過在按鈕的IBAction中定義排序並在@property中創建NSFetchRequest *請求。在按鈕動作我這樣做:

self.request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]]; 
[self.fetchedResultsController performFetch:&error]; 
[tableView reloadData]; 
1

你不能這樣做。如果您將SQLite後端用於Core Data,則排序在SQL級別上工作。
您不能使用自定義比較選擇器或塊。你必須根據你的實體的屬性進行單獨排序

爲什麼不把價格保存爲一個十進制數(這是一個NSDecimalNumber),它沒有像double和float這樣的精度問題。

然後您可以使用價格對數據進行排序。