多次对RKObjectManager进行子类化

时间:2015-02-03 14:04:39

标签: ios objective-c restkit

我有一个名为MyObjectManager的子类,它继承自RKObjectManagerMyObjectManager我初始化RestKit(设置基本网址等)

然后我将MyObjectManager子类化为两个不同的类: UserManagerGameManager。每个实现不同的功能

起初我打电话给UserManager sharedManager,它运作正常。我后来用相关函数调用了GameManager sharedManager,但是我得到一个“无法识别的选择器发送到实例”错误,因为它将后者称为UserManager

我在指南中读到可以多次继承RKObjectManager的子类,我缺少什么?

MyObjectManager实现:

static MyObjectManager *sharedManager = nil;

@implementation MyObjectManager

+ (instancetype)sharedManager {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *baseUrl = [NSString stringWithFormat:@"http://ip/api"];
        NSURL *url = [NSURL URLWithString:baseUrl];

        sharedManager = [self managerWithBaseURL:url];
        sharedManager.requestSerializationMIMEType = RKMIMETypeJSON;

        [sharedManager setupRequestDescriptors];
        [sharedManager setupResponseDescriptors];
    });

    return sharedManager;
}

1 个答案:

答案 0 :(得分:3)

那是因为RKObjectManager +sharedManager是一种类方法。它将在第一次调用时实例化共享管理器,然后在进一步调用时返回它。您对sharedManager的第一次调用确实实例化了一个RKObjectManager,而您对GameManager sharedManager的调用确实返回了同一个实例。该实例属于RKObjectManager类,它不实现GameManager的功能 - 因此无法识别的选择器发送到实例错误。

这对于子类RKObjectManager是完全可以接受的,但你也应该在+sharedManager中继承类方法GameManager,以返回你自己的静态实例,而不是依赖于RKObjectManager的那个。

编辑:根据您的编辑,您应该尝试在GameManager内创建+managerWithBaseURL子类,以便返回GameManager而不是RKObjectManager的实例。