2016-01-30 44 views
0

我有一個表格顯示Event(核心數據支持的對象)。我有另一個表格顯示Ticket。活動有很多門票。NSFetchedResultsController正在接收關係更改的didChangeObject?

當我創建新票證時,將其保存到持久性存儲中,控制Event的表格視圖會收到didChangeObject通知。我不想要它。表格視圖應該關心的事實並沒有改變。我碰巧創建/更改/修改了一些票據,根據Time Profiler的說法,通過處理那些didChangeObject,我在主線程上失去了一些寶貴的時間。

我調試它,它似乎發生在這裏:

ticket.event = event; 

我之前和行之後設置斷點,po「荷蘭國際集團的ticket.managedObjectContext.updatedObjects到控制檯,事件,只要我分配出現事件到票。

+0

您是否有(推薦)事件和票證之間的反向關係設置?如果是這樣,這就是觸發事件更新通知的原因。相關對象的更改不會觸發FRC,但關係中的更改將會(因爲該關係是相關對象的屬性)。 – Avi

+0

我是。好吧,這是有道理的,因爲我可以預見許多你想要通知的情況....也許我可以嘗試使用不同的託管對象上下文,並改變我保存到持久存儲的方式。 – JBlake

+0

當視圖消失時,將fetchedresultscontroller.delegate設置爲nil,然後將其設置回來並在viewWillAppear上執行reloadData/performFetch會是一個不錯的解決方案嗎?這是否解決了我的性能問題? – JBlake

回答

0

現在我將使用以下命令:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.fetchedResultsController.delegate = self; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"end_date >= %@", [NSDate date]]; 
    self.fetchedResultsController.fetchRequest.predicate = predicate; 

    NSError *error; 
    BOOL success = [self.fetchedResultsController performFetch:&error]; 
    if (!success) 
    NSLog(@"ERROR: performing fetch: %@", error); 

    [self.tableView reloadData]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    // we are not interested in changes when this view is offscreen 
    self.fetchedResultsController.delegate = nil; 
} 

雖然長期我一個解決方案時,當用戶希望提交他們的更改僅保存方面,因爲我有一堆 -/+單元格中的UISteppers,它會更有意義,我認爲有一個UIButton動畫到單元格中,按下後將保存上下文,而不是每次更改UIStepper時都保存上下文。

相關問題