Ric*_*kiG 13 objective-c ios restkit
我正在测试RestKit并且需要访问不同的BaseUrls并且有时也"同时"从不同的地方访问具有相同baseUrl的web服务,最后我还需要在同一个控制器中访问具有不同ressourcePath的相同baseUrl.
在我的app委托中,我像这样设置了RKObjectManager单例.
RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kBaseUrl];
[objectManager registerClass:[EntityClass1 class] forElementNamed:@"element1"];
[objectManager registerClass:[EntityClass2 class] forElementNamed:@"element2"];
.
.
.
etc.
Run Code Online (Sandbox Code Playgroud)
单例方法非常容易使用,但我无法弄清楚如何分离不同的Web服务调用.
在实现RKObjectLoaderDelegate的MyViewController中,我将有两个方法:
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
//stuff with result
}
- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error {
//stuff with error
}
Run Code Online (Sandbox Code Playgroud)
当MyViewController使用一个RKObjectManager单例来访问一个带有一个baseUrl的ressourcePath时,这不会导致任何问题.
如果我以这种方式启动不同的请求:
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:FLICKRPath delegate:self]
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:FOURSQUAREPath delegate:self]
Run Code Online (Sandbox Code Playgroud)
等等,在同一个MyController中,我的问题是FLICKRPath和FOURSQUAREPath当然有不同的baseUrl,但RKObjectManager只有一个?
如果我使用它并且可能有不同的RKObjectManagers,则会出现另一个问题.委托方法didLoadObjects和didFailWithError将从两个RKObjectManagers接收结果,我看不到任何其他方式来区分它们而不是从它们的baseUrls.潜在地将每个返回值与baseUrl进行比较,更糟糕的是,委托方法中的ressourcePath根本不会吸引我.
如果我有不同的RKObjectManagers,我想我可以传递不同的委托和构建专用于处理来自不同baseUrls和ressourcePaths的返回值的类.这意味着我必须在MyController和RestKit之上构建另一个抽象,这看起来也很混乱.
我有一种强烈的感觉,我会以错误的方式解决这个问题,RestKit源代码非常令人印象深刻,这表明我正在与框架作斗争.我真的很感激这个主题的一些最佳实践见解.我已经浏览了所有可以找到的资源和示例,但没有看到上述用例.它总是一个RKObjectManager,一个baseUrl和一个ressourcePath.
先感谢您.
til*_*ilo 10
由于尚未接受答案:使用多个对象管理器非常简单RestKit
.
您创建的第一个对象管理器将是默认情况下RestKit使用的共享单例.但是通过创建其他对象管理器,您可以根据需要从其BaseURL中提取,只需确保保留这些新管理器.
RKObjectManager *flickrManager =
[RKObjectManager objectManagerWithBaseURL:flickrBaseUrl]; // <-- shared singleton
RKObjectManager *foursquareManager =
[[RKObjectManager objectManagerWithBaseURL:foursquareBaseUrl] retain]; // <-- you must retain every other instance.
Run Code Online (Sandbox Code Playgroud)
根据您的应用程序,您可能希望将第二个对象管理器放在一个更易于访问的位置,例如AppDelegate上的保留属性,以便根据需要轻松提取.如果您需要区分两个(或更多)对象管理器的结果,只需在userData中为查询设置一个标识符.
- (void)someAction(id)sender {
// .......
RKObjectLoader* loader = [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/whatever" delegate:self];
loader.userData = @"foursquare";
// or do this, if you need a number instead of a string
loader.userData = [NSNumber numberWithInt:1234];
// .......
}
//Then when the delegate comes back you can cast it into a string or number as appropriate:
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {
// .......
NSString* source = (NSString*) objectLoader.userData;
// or, if you did the NSNumber instead:
NSNumber* source = (NSNumber*) objectLoader.userData;
// .......
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5307 次 |
最近记录: |