0

NSManagedObject を使用していくつかの値を保存していますが、そのためにエンティティを使用していません。一部のエンティティに限定したくないからです。(Oist *)managedObject.entity を使用してみましたが、機能しません。この managedObject を使用して theIt を取得する方法は次のとおりです。

Oist.h
@class File;

@interface Oist : NSManagedObject
@property (nonatomic, retain) NSSet *files;
@end

@interface Oist (CoreDataGeneratedAccessors)

- (void)addFilesObject:(File *)value;

File.h
@class Oist;

@interface File : NSManagedObject

@property (nonatomic, retain) Oist *gist;

@end

- (void)newManagedObjectWithClassName:(NSString *)className forRecords:(NSDictionary *)records
{
    NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:[[GPCoreDataController sharedInstance] backgroundManagedObjectContext]];
    [records enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [self setValue:obj forKey:key forManagedObject:newManagedObject];
    }];
}

- (void)setValue:(id)value forKey:(NSString *)key forManagedObject:(NSManagedObject *)managedObject
{
    File *fileEntity = [NSEntityDescription insertNewObjectForEntityForName:@"File" inManagedObjectContext:[[GPCoreDataController sharedInstance] backgroundManagedObjectContext]];

    if ([key isEqualToString:@"files"])
    {
        NSDictionary *files = (NSDictionary *)value;
        for (NSString *key in [files allKeys]) {
            NSDictionary *file = [files valueForKey:key];
            NSLog(@"%@", file[@"filename"]);
            [fileEntity setValue:file[@"filename"] forKey:@"filename"];
            [fileEntity setValue:file[@"type"] forKey:@"type"];
        }
    } else if ([key isEqualToString:@"id"])
    {
        if ([managedObject.entity.name isKindOfClass:[Oist class]]) {
        //here I want to use Oist's method - (void)addFilesObject:(File *)value; how to do that?
        }
        [managedObject setValue:[NSNumber numberWithInt:[value integerValue]] forKey:@"gistID"];
    }
}
4

1 に答える 1

0

私はあなたの質問を誤解しているかもしれませんが、一般的に型指定された (NSManagedObject *) をより具体的に型指定されたサブクラスとしてキャストすることを望んでいるようです。

一般的に渡されたポインターが実際にサブクラスのインスタンスであるかどうかを確認する方法は次のとおりです。

if ([managedObject isKindOfClass:[Oist self]]) {
    // managedObject may safely be cast to an Oist*
}

次のように、割り当てなしでキャストを実行できます。

[(Oist *)managedObject addFiles...];

または、適切な括弧を使用して、プロパティにアクセスします (ドット演算子はキャストよりも優先されるため、最初にキャストする必要があることをコンパイラに伝える必要があります)。

((Oist *)managedObject).entity

しかし、それは読者にとって明確ではなく、キャストを使用した明示的な割り当てよりも多くのキーストロークが発生する可能性があると思います。これは私が推奨するものです:

if ([managedObject isKindOfClass:[Oist self]]) {
   Oist *oist = (Oist *)managedObject;
   [oist addFilesObject:someFilesObject];
}
于 2013-09-04T04:20:19.520 に答える