多次子类化 RKObjectManager



我有一个名为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;
}
那是

因为RKObjectManager +sharedManager是一个类方法。它将在第一次调用时实例化共享管理器,然后在以后的调用中返回它。您对sharedManager的第一次调用确实实例化了 RKObjectManager,并且您对GameManager sharedManager的调用确实返回了相同的实例。这个实例是类RKObjectManager,它没有实现游戏管理器的功能 - 因此无法识别的选择器发送到实例错误。

这对于子类RKObjectManager是完全可以接受的,但您可能还应该在GameManager内部+sharedManager类方法进行子类化以返回您自己的静态实例,而不是依赖 RKObjectManager 的实例。

编辑

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

最新更新