2011-08-26 79 views
14

例子中,我NSFetchedResultsController叫在ListController稱爲FetchController爲什麼我們無法在NSFetchedResultsController中更改FetchRequest?

+(NSFetchRequest *)fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending; 

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{ 
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending]; 

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease]; 
    NSLog(@"FRC : %@",FRC); 
    return FRC; 
} 

看代碼,我打電話searchControllerInContext時,我想使NSFetchedResultsController,然後用這個代碼perfom它:

if (![[self ListController].FetchController performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

問題我不想總是在請求發生變化時執行提取操作,我想讓它變得容易

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest]; 

但[自我ListController] .FetchController.fetchRequest是隻讀..

我想這樣做,因爲我不想perfomFetch一次又一次..我可以這樣做嗎?

我的意思是,如果我有一個程序根據用戶放入搜索框給出記錄,每當搜索框內容發生變化時,是否應該創建一個新的控制器?這很奇怪。我認爲使用NSFetchedResultsController的重點是,我們不必這樣做?

回答

23

即使fetchRequest是隻讀屬性,您可以修改它。例如,只要您沒有緩存結果(或者只要您首先刪除緩存),設置獲取請求的謂詞就可以很好地工作。我已經在一些項目中成功地使用了這種技術。修改提取請求後,應該再次撥打performFetch

底線:每次搜索條件發生變化時,您都不需要創建FRC。只需刪除緩存,更改獲取請求的謂詞並使用現有實例獲取新的結果集。

+0

如果我緩存結果會發生什麼?如果我不緩存結果,是否需要再次調用performFetch? –

+0

修改提取請求將使您的緩存結果無效。無論何時修改提取請求,您都應該重新提取您的結果集。 –

+3

儘管這可能有效,但請考慮Apple在其文檔中寫入的內容:重要 在調用此方法[NSFetchedResultsController init方法]後,您不得修改fetchRequest。例如,你不能改變它的謂詞或排序順序。' – fabb

10

,如果我有一個程序,給出了基於投入 搜索框中什麼用戶記錄,應創建每次搜索框 內容變化的新控制器?

是的,因爲你改變了獲取的謂詞,這需要生成一個新的控制器。

我覺得使用NSFetchedResultsController的全部重點是我們 不必這樣做?

FRC的要點是自動處理上下文和tableview之間的交互。它具有專用屬性以返回部分和行以及委託方法來修改表以響應數據模型中的更改。由於FRC是通過提取來定義的,因此當您對提取進行更改時,您需要生成一個新的FRC。不要讓思考FRC的錯誤有一個大而昂貴的對象。不是。根據需要創建和處理大量FRC時不存在問題。

相關問題