首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用NSManagedObject实体使用NSManagedObject的方法

如何使用NSManagedObject实体使用NSManagedObject的方法
EN

Stack Overflow用户
提问于 2013-09-04 02:15:22
回答 1查看 105关注 0票数 0

我使用NSManagedObject保存一些值,但不使用实体。因为我不想把它局限于某些实体。我尝试使用(Oist *)managedObject.entity,但不起作用。如何使用这个managedObject获得如下所示:

代码语言:javascript
复制
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"];
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-04 04:20:19

我可能误解了您的问题,但看起来您希望将一个泛型类型(NSManagedObject *)转换为一个更具体的类型化子类。

检查指针是否泛化传递的方法实际上是子类的一个实例:

代码语言:javascript
复制
if ([managedObject isKindOfClass:[Oist self]]) {
    // managedObject may safely be cast to an Oist*
}

您可以在不需要分配任务的情况下完成演员角色,如下所示:

代码语言:javascript
复制
[(Oist *)managedObject addFiles...];

或者,使用适当的括号访问属性(点运算符比强制转换具有更高的优先级,因此需要首先告诉编译器您需要强制转换):

代码语言:javascript
复制
((Oist *)managedObject).entity

但我认为,这一点对读者来说不太清楚,而且可能更多地敲击键,而不是一个带有演员的明确任务,这就是我建议的:

代码语言:javascript
复制
if ([managedObject isKindOfClass:[Oist self]]) {
   Oist *oist = (Oist *)managedObject;
   [oist addFilesObject:someFilesObject];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18604403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档