2012-07-20 32 views
3

我有一個由NSFetchedResultController管理的tableview。 因爲我想獲取最近添加的記錄,我該控制器設置爲如下:如何重新排序顯示的獲取結果?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
request.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
request.fetchLimit = 100; 

那麼,結果將被命令時間遞減。 但我也希望結果按時間遞增放置在tableview中。
如何重新排序結果?

將結果放到另一個數組中並重新排序,並在更新獲取結果後每次都做同樣的事情?

+0

通過設置sortDescriptor升序否,它們會在表中也顯示升序號。這不是我想要的(我希望它們按時間上升是放在桌上......) – longway 2012-07-20 19:53:38

+0

爲什麼你不跑它們兩次?順便說一句,如果你有一個fetchLimit 100 recs並不意味着你會從某一天得到一切--100 recs?所以如果你想得到相反的結果,你會得到一天+100,但是如果有一天有一個1000 recs的距離,那麼你將不會得到相同的記錄。 – Panagiotis 2012-07-20 21:51:08

+0

@Panagiotis - 見下面的答案。 – isaac 2012-07-20 22:12:09

回答

1

把你的結果在一個數組...然後如果你想扭轉這種局面,設置升序YES,扭轉你的陣列:

NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects]; 

我認爲這是應該做的,最簡單的方法通過不取所有時間!

0

您的謂詞將結果集約束爲timeStamp大於或等於someDay的實體。

您的排序描述符通知提取請求應該檢索哪些記錄,以及按指定的順序實際排序/呈現它們。

您的提取限制規定將不會返回超過100個實體。

如果您有1000個匹配項,並且sortAscending爲YES,那麼您將返回比timeStamp更新的最舊記錄,然後是第二個最早的記錄。如果sortAscending爲NO,那麼您將返回比timeStamp更新的最新記錄,然後是第二個最新記錄,然後移回比timeStamp更新的最舊記錄(直到您打到第100個最早的記錄(如果存在))。

UIableViews和NSFetchedResultsControllers很自然地一起工作。只要你不想改變NSIndexPaths的處理方式,當你有一個表格視圖支持一個抓取的結果控制器時,你基本上可以得到命令,部分和插入/刪除操作。在這種情況下,不需要嘗試對結果集進行重新排序 - 告訴CoreData你想要什麼,多少以及按照什麼順序,你就能得到它。爲了讓你的結果如你所期望的(盡我所能說的),你只需要修改你的排序描述符來反映你實際上想要如何排序記錄。在這種情況下,將升序設置爲YES:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate]; 
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES]; 
request.sortDescriptors = [NSArray arrayWithObject:descriptor]; 
request.fetchLimit = 100; 

而且應該這樣做。在這種情況下,不需要反轉排序。