2012-09-03 227 views
0

我需要澄清一些來自蘋果文檔NSFetchedResultsController:DOC澄清需要

The fetch request must have at least one sort descriptor. If the controller generates sections, the first sort descriptor in the array is used to group the objects into sections; its key must either be the same as sectionNameKeyPath or the relative ordering using its key must match that using sectionNameKeyPath.

我以下列方式

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:mainContext 
             sectionNameKeyPath:@"paymentDate" 
               cacheName:nil]; 

使用NSFetchedResultsController使用節當我從商務部瞭解, NSFetchRequest我在NSFetchedResultsController必須至少有一個排序描述符。但自從我使用的部分,那種描述符必須是這樣的:

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects: 
     [NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES], 
     [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES], 
     nil]]; 

如果我使用排序的描述,例如

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects: 
     [NSSortDescriptor sortDescriptorWithKey:@"paymentCode" ascending:YES], 
     nil]]; 

我收到一個錯誤,如下面的

NSFetchedResultsController ERROR: The fetched object at index X has an out of order section name Y. Objects must be sorted by section name'

在我的情況,使用[NSSortDescriptor sortDescriptorWithKey:@"paymentDate" ascending:YES],它允許我克服這個問題。也許我只是幸運而已)。

但是,這是什麼意思或使用其鍵的相對順序必須與使用sectionNameKeyPath?你能給我一個解釋嗎?

預先感謝您。

回答

1

如果您正在使用部分,FRC需要知道如何對數據數組進行排序,以便按部分對所有結果進行分組。因此,無論您在提取請求中指定爲第一個排序描述符,都必須匹配您的部分如何分組,以便FRC可以正確執行。

您不必指定它們的確切字段,但排序順序應該相同。

例如,如果您的第一個排序描述符將按部分對數組進行分組,那麼即使它沒有引用該部分,也沒關係。在大多數情況下,您應該明確指定您的部分屬性,以消除FRC部分混淆的可能性 - 否則會引發異常。

編輯

例如,假設你有兩種類型的描述:sd1sd2sd1使用與在sectionNameKeyPath中提供給FRC的密鑰相同的密鑰。 sd2使用不同的密鑰。

當您對整個數組進行排序時,如果它們都生成將相同部分中的實體分組的最終數組,則可以使用sd1sd2作爲第一個排序描述符。

基本上,他們FRC將根據sectionNameKeyPath將實體分組爲幾個部分,因此它可以確定有多少節,以及每節中有多少行。因此,相對於sectionNameKeyPath,它作爲輸入獲得的數組必須分類到相似的分組中。

由於它在整個數組中徘徊,它會查看sectionNameKeyPath,並期望看到具有相同sectionNameKeyPath的特定數量的條目。因此,必須對數組進行排序以將所有部分保留在一起。

如果你能做到,如果沒有指定相同的密鑰作爲第一個排序描述符,那麼一切都將正常工作。如果不是,那麼你應該使用與第一個排序描述符相同的段密鑰。

+0

+1您的回覆。你能指定一下你的意思嗎?「你不必指定它們的確切字段,但排序順序應該是相同的。」?小樣本可能會有用;-)謝謝。 –

+0

謝謝喬迪。您對核心數據有很好的瞭解。乾杯。 –