单一模型在RestKit和其他类之间进行通信,请求在不使用单例时失败

时间:2013-03-13 16:15:12

标签: ios objective-c singleton restkit

在我的项目中,我有一个单例模型类APIModel,它处理对API的所有必要调用。我正在使用RestKit并经常设置HTTP标头。

这是我的问题:

AModel
- (void)makeRequest {
    [APIModel apiObject].getSpecificDataDelegate = self;
    [[APIModel apiObject] loadSpecificData];
}

BModel
- (void)makeRequest {
    [APIModel apiObject].getSpecificDataDelegate = self; // removes AModel as delegate so it ends up receiving both responses
    [[APIModel apiObject] loadSpecificData];
}

AModel将自己设置为委托,然后BModel将自己设置为委托。 BModel最终会收到两个API回复。

我解决这个问题的方法是为需要它的每个类启动APIModel的不同实例。

- (void)makeRequest {
    self.apiObject.getSpecificDataDelegate = self;
    [self.apiObject loadSpecificData];
}

- (APIModel *)apiObject {
    if (!_apiObject) apiObject = [[APIModel alloc] init]; // classes own instance
    return _apiObject;
}

由于某些原因,虽然所有这些APIModel实例都没有将HTTP标头正确地附加到请求,因此它们都在API端失败。任何仍然使用单例对象的模型仍然可以正常工作。

我认为这是RKClient的单例(sharedClient)的一个问题,但我不确定。它不是零,我可以设置HTTP标头,甚至打印出来,但我的API不断抛出异常。是否有任何明显的原因导致HTTP标头在不使用单例时无法将自身附加到请求中? 我可以使用不同或更好的设计模式吗?

我找到了this question虽然很有洞察力但它与我的问题并不完全相关,但有没有办法做类似的事情?

我考虑过使用NSNotificationCenter但是需要传递更多信息才能让AModelBModel了解他们的数据。

1 个答案:

答案 0 :(得分:0)

单身代表的单身人士= BAD DESIGN。

正如您所看到的,您几乎立即遇到了所有权问题。

NSNotificationCenter允许您通过通知传递尽可能多的信息。有一个单独的多个对象可以触发请求的单例,但你需要记住任何一个与单例交互的对象,可能不是唯一的对象。

做同样的事情:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestSucceeded:) name:RequestSucceededNotification object:nil];

self.someID = @"Some_ID_You_Have";
//Doesn't have to be an ID, but you need a way to differentiate the notifications
[[APIModel apiObject] loadSpecificDataWithID:self.someID];

然后,一旦获得数据,就可以从APIModel类中执行以下操作:

 [[NSNotificationCenter defaultCenter] postNotificationName:RequestSucceededNotification object:theID userInfo:@{@"data" : data}];

最后是AModel和BModel

- (void)requestSucceeded:(NSNotification *)notification
{
    if ([self.someID isEqualToString:[notification object]] == YES) {

        //Grab your data and do what you need to with it here
        NSData *data = [[notification userInfo] objectForKey:@"data"];
   }
}