2011-08-13 20 views
3

我爲我的UITableView使用NSFetchedResultsController,它顯示一堆事件,即時存儲在覈心數據中。使用Core Data實體更新表節標題的有效方法?

我想要做的是按相對日期(即今天,明天,本週等)對錶格進行分組。每個事件都有一個開始日期和我試圖創建名爲sectionIdentifier事件實體瞬態特性上面,像這樣爲提及的日期,其轉換爲相對日期:

- (NSString*)sectionIdentifier 
{  
[self willAccessValueForKey:@"sectionIdentifier"]; 
NSString *tmp = [self primitiveSectionIdentifier]; 
[self didAccessValueForKey:@"sectionIdentifier"]; 

if (!tmp) 
{ 
    tmp = [Utility formattedDateRelativeToNow:self.startTime]; 
    [self setPrimitiveSectionIdentifier:tmp]; 
} 
return tmp; 
} 

的問題是,它顯然不僅會一次並不會自我更新,除非日期發生變化,我並不真正期待。我曾想過重寫getStartDate訪問器來更新sectionIdentifier,儘管這看起來有點笨重和低效,因爲每次訪問該屬性時都會執行此更新。

任何想法?

回答

4

這樣做的最好的方法是比較常理。除了更改抓取的結果控制器或Core Data中的任何內容外,您還可以使用類別擴展NSDate,以使keyname/method返回基於適當日期計算的值。然後在提取的結果控制器sectionNameKeyPath中包含密鑰名稱/方法。

看到這個以前的答案的how to extend NSDate with keyname/methods like today, yesterday, tomorrow etc.

一個例子來使用它,你只需要在方法的實體的日期屬性獲取的成果控制器讀取,像這樣:

NSFetchedResultsController *frc=[[NSFetchedResultsController alloc] initWithFetchRequest:aFetch 
                    managedObjectContext:aMoc 
                     sectionNameKeyPath:@"startdate.yesterday" 
                       cacheName:nil]; 

...並且各部分將自動出現。

+0

很不錯,指針的thx – James

1

我認爲您需要更新您的部分標題,因爲您顯示的部分(這似乎是一天)的最短持續時間。我將在已進行以下着衣

1)除使用applicationDidFinishLaunchingNSUserDefaults當前時間戳等

2)下一次啓動應用時,確定當前時間戳之間的差&一個保存。

3)如果差異超過您的最小持續時間(一天),請重新生成您的表格,包括部分標題,因爲今天會變成昨天&昨天可能已成爲上週。

HTH,

阿克沙伊

相關問題