2011-11-09 4 views
0

일부 핵심 데이터 클래스를 하위 클래스로 만들려고합니다. 나는 다음과 같은 클래스를 가지고 :목표 C 상속

코어 데이터 클래스 :

@interface CDExplanatoryMaterial : NSManagedObject 

@property (nonatomic, retain) NSString * document; 
@property (nonatomic, retain) NSString * id; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * pageNumber; 
@property (nonatomic, retain) NSNumber * realPageNumber; 
@property (nonatomic, retain) NSString * url; 

@end 

비즈니스 로직 클래스의 프로토콜 : BLExplanatoryMaterial에 대한

@protocol BLDataClass <NSObject> 

- (NSArray*)favouriteInGroups; 
@property (nonatomic, readonly, retain) NSString* type; 
@property (nonatomic, readonly, retain) NSArray* inFavouriteGroups; 

- (void)addAddToFavouriteGroup: (NSString*) groupName; 
- (void)removeFromFavouriteGroup: (NSString*) groupName; 
- (void)addToHistory; 

@end 

인터페이스 :

@interface BLExplanatoryMaterial : CDExplanatoryMaterial <BLDataClass> 

나는 데이터를 얻을 좋아요 :

+ (NSMutableArray*) explanatoryMaterials { 
    NSMutableArray* results = [[NSMutableArray alloc] init]; 
    for(CDExplanatoryMaterial *item in [Helper fetchDataObjectsOfType:@"CDExplanatoryMaterial"]) 
    { 
     [results addObject: (BLExplanatoryMaterial*)item]; 
    } 
    return results; 
} 

도우미 클래스는 다음과 같습니다 : 내가 가지고있는

@implementation Helper 
+ (NSArray*) fetchDataObjectsOfType:(NSString *)type { 
    DataManager* manager = [DataManager sharedInstance]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
           entityForName:type inManagedObjectContext:manager.mainObjectContext]; 
    [fetchRequest setEntity:entity]; 
    NSError *error; 
    NSArray *fetchedObjects = [manager.mainObjectContext executeFetchRequest:fetchRequest error:&error]; 
    return fetchedObjects; 
} 
@end 

이 문제는 fetchDataObjectsOfType에서 fetchedObjects 배열 explanatoryMaterials의 결과 배열은 NSManagedObject 객체를 포함한다는 것이다. fetchedObjects에 BExxplanatoryMaterial을 포함하는 CDExplanatoryMaterial 객체와 결과가 포함될 것으로 기대됩니다. 최종 결과가 BLExplanatoryMaterial 객체가 필요하거나 내 인스턴스 메서드 중 하나를 사용할 수 없습니다.이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

감사합니다,

편집 :

은 그냥이 expMat가 NSManagedObject하고 addToFavouriteGroup 방법을 지원하지 않기 때문에 실패 다음 코드 명확히하기.

NSMutableArray* expMats = [Data explanatoryMaterials]; 
BLExplanatoryMaterial* expMat = (BLExplanatoryMaterial*) [expMats objectAtIndex:0]; 
[((BLExplanatoryMaterial*)expMat) addToFavouriteGroup:@"Test Group"] 

내가 언급 한 것을 잊어 버린 점 중 하나는 원래 게시물의 모든 코드가 정적 라이브러리에 있다는 것입니다. 이 편집에 게시 된 코드는 IOS App 프로젝트에 있습니다. 이것이 차이를 가져올 지 모르겠습니다. 정적 라이브러리의 모든 클래스는 public으로 표시됩니다.

답변

1

관리 대상 개체 모델의 엔터티 클래스로 BLExplanatoryMaterial을 지정해야합니다. 그러면 코어 데이터에 NSManagedObject 대신 해당 클래스의 객체가 인스턴스화됩니다.

+0

Configurations -> Default 비트를 살펴 봤는데 CDExplanatoryMaterial이 CDExplanatoryMaterial 엔티티의 클래스라고합니다. 내가 옳은 것 같은데? 나는 그것을 바꾸려고 노력할 것이다. – JoeS

+0

클래스를 변경해도 아무런 차이가 없습니다. – JoeS

+0

'NSManagedObject' 서브 클래스에서'-awakeFromFetch'를 오버라이드 (override)하여 객체가 저장소에서 가져올 때 호출되는지 확인할 수 있습니까? – Aderstedt

0

도움 주셔서 감사합니다. 핵심 데이터 클래스가 별도의 정적 라이브러리에 있기 때문에 기본 번들에 내장되지 않았기 때문입니다. 이 문제를 해결하기 위해 메인 애플리케이션 내에서 하위 클래스로 분류 한 다음 해당 하위 클래스의 핵심 데이터 파일을 가리켰습니다.