如何在objective-c中创建两个模型类的包装类

时间:2012-08-04 13:12:34

标签: objective-c ios core-data nsmanagedobject

我正在开发一个应用程序,我有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该布局基于模型类的属性。问题是我目前有很多if语句来检查它是哪个类。

示例:

- (UIView *)setUpViewForObject:(id)object
{

    // Check if it is a Post or Event object
    Post *post;
    Event *event;
    if ([object class] == [Event class]) {
        event = (id)object;
    } else if ([object class] == [Post class]) {
        post = (id)object;
    }

    if (post) {
        // Do stuff
        // ie:
        self.customUiView.textField.text = post.text;
    } else if (event) {
        // Do similar stuff
        // ie:
        self.customUiView.textField.text = event.text; 
    }
}  

这个解决方案看起来很冗余,我在几个地方都这样做了。因此,我想知道是否可以创建两个NSManagedObject类的包装类。我使用CoreData并从xCode生成模型,因此我不会使用所有这些if语句。

类似的东西:

@interface News : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]

@interface Event : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]

是否可以使用枚举创建这两个NSManagedObject类的包装类。我也希望这些对象可以更新,删除等等。我想我可能会使用Enum或类似的东西创建一个抽象类,但我不知道这样的类会如何看起来,工作和使用。

任何建议,如果这是可能的,在这种情况下,这样的包装类将如何看起来将非常感激。

2 个答案:

答案 0 :(得分:1)

Core Data支持抽象超类的概念。因此,您可以使用一个属性(比如“tag”)来定义它,以区分这两个类。然后新闻和事件都把那个班级作为他们的超类。这是与Core Data一起使用的一种非常常见的解决方案。

答案 1 :(得分:1)

尝试这样做:

//in NewsEventRootObject.h
@interface NewsEventRootObject:NSManagedObject //root object for these two classes

[...]

@property (nonatomic,retain) NSString *text; //similar fields in here

-(void) getSomeValue;

//in News.h
@interface News : NewsEventRootObject

[...]

-(void) getNews;

//in Event.h
@interface Event : NewsEventRootObject

[...]

-(void) getEvent;

//in your "handler".m

- (UIView *)setUpViewForObject:(NewsEventRootObject *) object
{ 
    //you can access similar fields and methods without if/else statements
    self.customUiView.textField.text = object.text;

    SomeValue *someValue=[object getSomeValue];

    //but for class-specific you should make a check
    if ([object respondsToSelector:@selector(getEvent)]) {

    }

    if ([object respondsToSelector:@selector(getNews)]) {

    }

}  

实际上,永远不要通过==检查类,使用isKindOfClass语句