3

我目前有一個問題,當我的UITableViewController/UITableView使用NSFetchedResultsController時,FRC的fetchRequest上的fetchLimit爲4時顯示大約86個項目。我知道86個項目滿足獲取本身,並且我知道它們出現的原因是因爲didChangeObject:atIndexPath ...被86中的每一個調用,並且我插入爲默認實現類型。objectAtIndex:0] numberOfObjects]> fetchLimit

我的問題是爲什麼fetchLimit限制NSFetchedResultsController試圖「更改」(在這種情況下插入)的對象的數量?

我的應用程序用例是,第一個選項卡顯示了我在應用程序啓動時獲得的典型供稿項目(在側線上)。我將它們保存到CoreData上的一個單獨的上下文中,該上下文最終會合併到主線程的上下文中,併爲更改的內容啓動FRC回調。我的問題具體涉及沒有項目的初始情況。


這裏是我的fetchRequest:

NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
fetchRequest.entity = [NSEntityDescription entityForName:ENTITY_CONTENT_ITEM inManagedObjectContext:managedObjectContext]; 

// Set a limit on the number of items returned 
[fetchRequest setFetchLimit:4]; 

// Set a Predicate to limit the fetch to featured items only 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"featured == YES AND contentType == %d", contentType]]; 

// Set the sort descriptors 
NSSortDescriptor *sortDateDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"sortDate" ascending:NO] autorelease]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDateDescriptor]]; 

將contentType以上僅僅是打破了什麼是應該在這個選項卡與其他選項卡中顯示的方式。特色是該項目上的布爾屬性,它更像是用於顯示目的的關閉開關。

這裏是我的didChangeObject:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
    switch(type) { 
    case NSFetchedResultsChangeInsert: 
     [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
    case NSFetchedResultsChangeDelete: 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
    case NSFetchedResultsChangeUpdate: 
     [tableView cellForRowAtIndexPath:indexPath]; 
     break; 
    case NSFetchedResultsChangeMove: 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     // Reloading the section inserts a new row and ensures that titles are updated appropriately. 
     [tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
     break; 
    } 
} 

我知道這將是很難回答這個問題,但即使的FRC如何決定多少次調用didChangeObject將是很有益的解釋。

回答

1

https://devforums.apple.com/thread/60319?tstart=0

對於那些誰可以訪問此,檢查出來。蘋果開發人員可以快速總結iOS4.0中對CoreData/NSFetchedResultsController/UITableViewController堆棧所做的更改。

爲了提高緩存和性能以及修復已知問題,在3.2和4.0中進行了更改。持久性緩存更具侵略性,因此濫用cacheName的人遇到了麻煩。將cacheName設置爲nil,或者清理使用情況,並在適當的時候調用+ deleteCacheWithName來解決這個問題。重新計算部分得到了改進,以便儘可能通過數據庫執行更多計算,而不是內存。每當緩存被重建時(或者如果不使用緩存,當performFetch被調用時),分段觸發。 .description解決方法使keypath引用一個未建模的屬性(-description方法),它導致段計算在內存中工作,因爲db不知道任何關於-description的內容。

在4.0中,對UITableView也進行了更改以修復涉及UITableViewController委託回調的多個問題。需要在早期iOS版本上使用-reloadData來解決問題的人應該能夠在iOS4上使用更細粒度的回調。

-BenT(蘋果)

鑑於此,我在fetchedResultsController initWithFetchRequest呼叫.DESCRIPTION添加到我的sectionNameKeyPath。這顯然使得部分計算髮生在內存中,而不是在磁盤上,這就解決了我的部分認爲他們的項目多於他們的問題。

這適用於4.0,在3.0我只是從controllerDidChangeContent回調中調用reloadData。如果您有類似問題,請隨時向我發送消息。

相關問題