2013-06-05 77 views
2

我開始創建一個應用程序與核心數據,檢索數據的分段表我想使用NSFetchedResultController,在example從蘋果有兩個額外的屬性。瞭解NSFetchedResultsController的瞬態屬性

  • primitiveTimeStamp
  • primitiveSectionIdentifier

對於primitiveSectionIdentifier蘋果的情況下說,

與此相反,瞬時屬性指定的兩個屬性和 你必須編寫代碼執行轉換。

因爲sectionidentifier是transient屬性。 但timeStamp呢?這個屬性不是一個瞬態的,​​爲什麼有一個primitiveTimeStamp屬性?以及爲什麼timeStamp有明確的setter?

- (void)setTimeStamp:(NSDate *)newDate { 

    // If the time stamp changes, the section identifier become invalid. 
    [self willChangeValueForKey:@"timeStamp"]; 
    [self setPrimitiveTimeStamp:newDate]; 
    [self didChangeValueForKey:@"timeStamp"]; 

    [self setPrimitiveSectionIdentifier:nil]; 
} 

或者它可能不是一個實際的setter? _timeStamp = newDate在哪裏?

回答

4

CoreData爲您生成訪問器。它生成「公共和原始獲取和設置建模屬性的訪問器方法」。

所以在這種情況下,它已經產生:

-(NSDate*)timeStamp; 
-(void)setTimeStamp:; 
-(NSDate*)primitiveTimeStamp; 
-(void)setPrimitiveTimeStamp:; 

「爲什麼有primitiveTimeStamp財產?」

該聲明僅僅是爲了壓制編譯器警告。即。如果您刪除了該屬性的聲明,則會在編譯時發現警告,但代碼仍會運行。 或者你也可以使用[self setPrimitiveValue:newDate forKey:@"timeStamp"];

「爲什麼有對於timestamp明確的制定者?」

這是必需的,因爲設置timeStamp需要重新計算'sectionIdentifier'。這是通過將其設置爲nil並讓get訪問器重新計算它來實現的。

「where is _timeStamp = newDate?」

這相當於基本上在setPrimitiveTimeStamp的自動生成實現中完成。

引自文檔:

默認情況下,核心數據動態創建高效公衆和原始 get和set訪問方法建模屬性(屬性和關係)管理的對象類。這包括鍵值編碼可變代理方法,如addObject:和removed:,如在mutableSetValueForKey的文檔中詳細描述的: - 管理對象對於其所有多對多關係都是有效的可變代理。

注意:如果您選擇實現自己的訪問器,則動態生成的方法不會替換您自己的代碼。 例如,給定一個具有屬性firstName的實體,Core Data會自動生成firstName,setFirstName:,primitiveFirstName和setPrimitiveFirstName :.核心數據即使對於由NSManagedObject表示的實體也是如此。要在調用這些方法時抑制編譯器警告,應該使用Objective-C 2.0聲明的屬性功能,如「聲明」中所述。

+0

謝謝你的回答,但我並不完全理解所有這些屬性的含義原始前綴。因爲據我瞭解,核心數據會爲Entity中的所有屬性生成原始getter和setter?你能否請你解釋爲什麼有兩個屬性單個屬性 – taffarel