2011-11-17 76 views
0

我正在編寫一個應用程序,顯示一些基於一週中某天的變化的數據。該應用程序的上下文是即將舉行的會議。我想顯示當天的日曆條目。事件細節存儲在coredata中。iOS CoreData NSPredicate不清除

我用什麼來創建NSPredicate是:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd"]; 
NSDate *today = [NSDate date]; 
NSString *sunday = @"2011-12-04"; 
NSString *monday = @"2011-12-05"; 
NSString *tuesday = @"2011-12-06"; 
NSString *wednesday = @"2011-12-07"; 
NSInteger dayNumber = 1; 

if ([[df stringFromDate:today] isEqualToString:sunday]) { 
    dayNumber = 2; 
} else if ([[df stringFromDate:today] isEqualToString:monday]) { 
    dayNumber = 3; 
} else if ([[df stringFromDate:today] isEqualToString:tuesday]) { 
    dayNumber = 4; 
} else if ([[df stringFromDate:today] isEqualToString:wednesday]) { 
    dayNumber = 5; 
} 

NSExpression *lhs = [NSExpression expressionForKeyPath:@"day_number"]; 
NSExpression *rhs = [NSExpression expressionForConstantValue:[NSNumber numberWithInt:dayNumber]]; 

NSPredicate *equalToPredicat = [NSComparisonPredicate predicateWithLeftExpression:lhs 
                    rightExpression:rhs 
                     modifier:NSDirectPredicateModifier 
                      type:NSEqualToPredicateOperatorType 
                      options:0]; 

// Edit the sort key as appropriate. 
NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start_time" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:/*sortDescriptorDayNumber,*/ sortDescriptorTime, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[fetchRequest setPredicate:equalToPredicat]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                          managedObjectContext:managedObjectContext 
                           sectionNameKeyPath:@"day_number" 
                             cacheName:@"TodayCache"] 

我所看到的是,雖然當日期改變(即:週六至週日)的數據(在一個UITableView顯示)沒有按」 t得到更新。

謝謝, 馬特。

+0

沒有你在你的問題有代碼的觸動的tableview在所有。你爲什麼期望tableview奇蹟般地改變? – deanWombourne

回答

1

上面的評論是正確的。一些更多的信息。

1)該表將只更新時[tableView reloadData]或其他重載方法被調用

2)如果設置爲NSFetchedResultsController的委託,你可以迴應模型更改並重新加載表

3)日期變化不是模型變化(除非你在模型本身中更新日期),NSFetchedResultsController只會在檢測到它的管理對象上下文發生變化時纔會自行更新。

4)當你改變謂詞(即請求)時,你需要做fetchedResultsController:performFetch:error。否則,表格將重新加載舊數據。

要根據日期變化來刷新表格,您需要以您喜歡的任何間隔檢測日期更改並在此時重新載入表格。你可以做的一種方法是計算當前時間和午夜之間的時間間隔,並設置一個定時器在該時間間隔後觸發。定時器觸發時,更改謂詞,使用結果控制器執行提取並重新加載表。然後設置一個新的計時器,直到下一個午夜。如果您希望在用戶時區完成此操作,則還需要考慮這一點。

編輯:澄清答案,一個performFetch必要時謂語改變

+0

雖然在調用這個函數時,我一直在調用[tableView reloadData],但數據不會被更新。 –

+1

你在做我上面所說的一切嗎?當你改變fetchedResultsController使用的請求時,你需要在'reloadData'之前調用'performFetch:...'。如果你不改變請求,你需要。該請求在創建時使用當前日期。它不會跟蹤日期更改本身。 – XJones

+0

好的,謝謝你提供的信息。真的涵蓋了很多東西。至於要解決的問題,我必須清除抓取的結果緩存,然後才能正確更新。 –