正确的方法来动态决定要创建的类

时间:2012-10-11 13:49:47

标签: objective-c

我有一种情况,我加载了一个Facebook提要,并根据帖子类型(视频/图像/链接等),我创建相应的类。每个帖子类型都有一个不同的对应模型类和视图类,但是每个帖子只有一个控制器类被实例化。 现在我需要一种动态决定在控制器内为特定帖子类型创建哪个模型和视图类的方法。现在,我有一个创建助手类,它根据帖子类型返回相应的模型和视图类。但这似乎是一种混乱的做事方式。如果有20种帖子类型,那就是20条if语句。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

有一个plist文件将帖子类型映射到类名。把它读成字典。使用post类型作为键在字典中查找类名。然后使用NSClassFromString()创建实际的类。

答案 1 :(得分:1)

您可以根据用于处理类型的类名保留帖子类型的地图(各种):

static struct
{
    PostType type;         // A typedef'd enum with POST_TYPE_ONE, ...
    NSString *classname;
} _handlers[] = 
{
    { POST_TYPE_ONE, @"OneHandler" },
    { POST_TYPE_TWO, @"TwoHandler" },
    ....
    { POST_TYPE_TWENTY, @"TwentyHandler" }
};

const NSUInteger NUM_HANDLERS = sizeof(_handlers) / sizeof(_handlers[0]);

然后使用:

实例化类实例
id handler = nil;
for (NSUInteger index = 0; index < NUM_HANDLERS && handler == nil; index++)
{
    if (postType == _handlers[index].postType)
    {
        handler = [[ NSClassFromString(_handlers[index].classname) alloc ] init];
    }
}

或者,如果您可以保证postType始终在0到19之间,可以保留一组类名并使用:

id handler = [[ NSClassFromString(_handlers[postType] alloc ] init];

您应确保所有处理程序类派生自公共基类,以提供通用功能。