いくつかのコアデータクラスをサブクラス化しようとしています。私は、次のクラスを持っている:目的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にCDExplanatoryMaterialオブジェクトとBLExplanatoryMaterialを含む結果が含まれていると思います。私は最終結果がBLExplanatoryMaterialオブジェクトである必要がありますか、私はインスタンスメソッドを使用することはできません、これを行うための最善の方法は何ですか?
おかげで、
ジョー
EDIT:
ちょうどそれがexpMatがNSManagedObjectで、addToFavouriteGroupメソッドをサポートしていないため失敗し、次のコードで明確にします。
NSMutableArray* expMats = [Data explanatoryMaterials];
BLExplanatoryMaterial* expMat = (BLExplanatoryMaterial*) [expMats objectAtIndex:0];
[((BLExplanatoryMaterial*)expMat) addToFavouriteGroup:@"Test Group"]
私の言うことを忘れてしまったことの1つは、オリジナルの投稿のすべてのコードが静的ライブラリにあることです。この編集に投稿されたコードは、IOS Appプロジェクトにあります。これが違いを生むかどうかは分かりません。静的ライブラリ内のすべてのクラスはpublicとしてマークされます。
私はConfigurations - > Defaultビットを調べて、CDExplanatoryMaterialはCDExplanatoryMaterialエンティティのクラスであると言います。これは正しいと思う?私はそれを変更しようとします。 – JoeS
クラスを変更しても違いはありません。 – JoeS
'NSManagedObject'サブクラスで' -awakeFromFetch'をオーバーライドして、オブジェクトがストアからフェッチされたときに呼び出されるかどうか確認できますか? – Aderstedt