在我的项目中,我有一个单例模型类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
但是需要传递更多信息才能让AModel
和BModel
了解他们的数据。
答案 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"];
}
}