多次子类化 RKObjectManager
Subclassing RKObjectManager multiple times
我有一个名为 MyObjectManager
的子类,它继承自 RKObjectManager
在 MyObjectManager
我初始化 RestKit(设置基础 url 等等)
然后我将 MyObjectManager
子类化为两个不同的 类:
UserManager
和 GameManager
。各自实现不同的功能
起初我调用 UserManager sharedManager
并且它工作正常。后来我用相关函数调用了 GameManager sharedManager
,但我得到了一个 "unrecognized selector sent to instance" 错误,因为它将后者称为 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
是一个 class 方法。它将在第一次调用时实例化共享管理器,然后 return 在以后的调用中实例化它。您对 sharedManager
的第一次调用确实实例化了一个 RKObjectManager,而您对 GameManager sharedManager
的调用确实 return 了相同的实例。这个实例是 class RKObjectManager ,它没有实现 GameManager 的功能 - 因此 无法识别的选择器发送到实例 错误。
这对于 subclass RKObjectManager
是完全可以接受的,但是您可能还应该将 class GameManager
中的 class 方法 +sharedManager
subclass 到return 你自己的静态实例而不是依赖于 RKObjectManager 的实例。
编辑:根据您的编辑,您应该尝试在 GameManager
内子 class +managerWithBaseURL 这样 returns 就是 GameManager
的一个实例而不是 RKObjectManager
.
我有一个名为 MyObjectManager
的子类,它继承自 RKObjectManager
在 MyObjectManager
我初始化 RestKit(设置基础 url 等等)
然后我将 MyObjectManager
子类化为两个不同的 类:
UserManager
和 GameManager
。各自实现不同的功能
起初我调用 UserManager sharedManager
并且它工作正常。后来我用相关函数调用了 GameManager sharedManager
,但我得到了一个 "unrecognized selector sent to instance" 错误,因为它将后者称为 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
是一个 class 方法。它将在第一次调用时实例化共享管理器,然后 return 在以后的调用中实例化它。您对 sharedManager
的第一次调用确实实例化了一个 RKObjectManager,而您对 GameManager sharedManager
的调用确实 return 了相同的实例。这个实例是 class RKObjectManager ,它没有实现 GameManager 的功能 - 因此 无法识别的选择器发送到实例 错误。
这对于 subclass RKObjectManager
是完全可以接受的,但是您可能还应该将 class GameManager
中的 class 方法 +sharedManager
subclass 到return 你自己的静态实例而不是依赖于 RKObjectManager 的实例。
编辑:根据您的编辑,您应该尝试在 GameManager
内子 class +managerWithBaseURL 这样 returns 就是 GameManager
的一个实例而不是 RKObjectManager
.