0

在我的项目中,我有一个单例模型类,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)的问题,但不确定。它不是 nil,我可以设置 HTTP 标头甚至将它们打印出来,但我的 API 不断抛出异常。当不使用单例时,HTTP 标头无法将自己附加到请求中是否有任何明显的原因?我可以利用不同的或更好的设计模式吗?

我发现了这个问题,虽然很有见地,但它与我的问题并不完全相关,但有没有办法做类似的事情?

我考虑过使用NSNotificationCenter,但随后需要传递更多信息以允许AModelBModel知道哪些数据适合他们。

4

1 回答 1

0

具有单个代表的单身人士 = 糟糕的设计。

如您所见,您几乎立即遇到所有权问题。

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"];
   }
}
于 2013-03-13T17:39:47.120 回答