2011-08-25 51 views
4

我無法弄清楚這一點。我讀過的有關瞬態屬性的信息告訴我,它們可以在未定義類型的對象模型中識別出來。但編譯器抱怨這種類型是未知的錯誤。使用核心數據實現瞬態屬性

從核心逸編程指南:

如果不支持的屬性是一個對象,然後在管理對象模型,你可以指定其類型爲不確定的,而且它是短暫的。在實現實體的自定義類時,不需要爲該屬性添加實例變量,您可以使用託管對象的私有內部存儲。關於下面描述的實現需要注意的一點是它們緩存瞬態值。這使訪問價值更有效率 - 這也是變更管理所必需的。如果您定義了自定義實例變量,則應該在didTurnIntoFault中清理這些變量,而不是dealloc或finalize。

這裏是頭文件:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class SearchTerms; 

@interface SearchResult : NSManagedObject { 
@private 
} 
@property (nonatomic, retain) NSString * lattitude; 
@property (nonatomic, retain) NSString * details; 
@property (nonatomic, retain) NSString * endTime; 
@property (nonatomic, retain) NSString * longitude; 
@property (nonatomic, retain) NSString * city; 
@property (nonatomic, retain) NSString * title; 
@property (nonatomic, retain) NSString * imageLink; 
@property (nonatomic, retain) NSString * startTime; 
@property (nonatomic, retain) UNKNOWN_TYPE coordinate; 
@property (nonatomic, retain) UNKNOWN_TYPE subtitle; 
@property (nonatomic, retain) SearchTerms * searchUsed; 

@end 

我想包括與標題,副標題的MKAnnotation屬性,和協調。在這裏,我需要從其他字段導出字幕,並從經度和緯度導出座標。

我不確定如何協調指南的內容和看起來很明顯的錯誤,編譯器這樣說。

一旦我得到正確的標題,我可能能夠得到實施的權利,我會使用awakeFromFault設置值。我不確定是否需要使用didTurnIntoFault發佈副標題,這將是一個NSString,但這似乎是指南所要做的。

我還沒有看到如何實現一個簡單的瞬態屬性真的很好的例子。我很想嘗試將屬性添加到託管對象實體,並忘記在託管對象模型中提及它。但是,如果我這樣做,我似乎會忽略一些東西。

回答

1

這裏的問題是MKAnnotation協議將其coordinate值存儲在CLLocationCoordinate2D中,該值不是對象而是結構,並且不支持鍵值編碼。要將其用作過渡屬性,您需要將其包裝在一個對象中。

The Core Data Programming Guide: Scalar Value Constraints

如果你想使用一個標量型或結構,是不是核心數據直接支持那些 之一,而不是由鍵 - 值編碼支持結構 之一,你必須存儲它在您的託管對象 中作爲一個對象(通常是一個NSValue實例),但您也可以定義您自己的自定義類。然後,您會將其視爲本文後面所述的對象 的值。 對象的用戶可以在檢索該值時從NSValue(或自定義) 對象中提取所需結構,並在設置該值時將結構轉換爲 NSValue(或自定義)對象。

+0

假設您正在存儲一個對象,但是:是否適合使用Undefined和Transient以避免將其保留在Core Data中?如果是這樣,那麼你應該如何處理這些'UNKNOWN_TYPE'?用實際類型替換它們? –

2

您需要的屬性的類型更改爲id,或什麼是最合適的:

@interface SearchResult : NSManagedObject 
{} 
@property (nonatomic, retain) id coordinate; 
@end 

另一種方式來處理,這是通過KVC和依賴鍵:

@implementation SearchResult 
+ (NSSet *) keyPathsForValuesAffectingCoordinate 
{ 
    return [NSSet setWithObjects:@"latitude", @"longitude", nil]; 
} 

- (id) coordinate 
{ 
    // Derive the coordinate value 
} 
@end