一次以上一个RKObjectManager(RestKit)

| 我正在测试RestKit,需要访问不同的BaseUrl,有时还需要从不同的位置“一次”访问具有相同baseUrl的Web服务,最后,我还需要在同一控制器中使用不同的ressourcePaths访问相同的baseUrl。 在我的应用程序委托中,我像这样设置RKObjectManager单例。
RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kBaseUrl];
[objectManager registerClass:[EntityClass1 class] forElementNamed:@\"element1\"];
[objectManager registerClass:[EntityClass2 class] forElementNamed:@\"element2\"];
.
.
.
etc.
单例方法确实很容易使用,但是我无法弄清楚如何分隔不同的Web服务调用。 在实现RKObjectLoaderDelegate的MyViewController中,我将有两种方法:
- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects         {
    //stuff with result
}

- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error {
    //stuff with error    
}
当MyViewController使用一个RKObjectManager单例访问带有一个baseUrl的一个ressourcePath时,这不会引起任何问题。 如果我以这种方式发出不同的请求:
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:FLICKRPath delegate:self]
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:FOURSQUAREPath delegate:self]
等等,在同一个MyController中,我的问题是FLICKRPath和FOURSQUAREPath当然具有不同的baseUrl,但是RKObjectManager只有一个吗? 如果我能正常工作并且可以使用其他RKObjectManagers,则会出现另一个问题。 委托方法didLoadObjects和didFailWithError将同时从RKObjectManagers接收结果,除了baseUrls之外,我看不到其他区分它们的方法。在委托方法中可能将每个返回值与baseUrl甚至更糟的是ressourcePath进行比较,这对我完全没有吸引力。 如果我有不同的RKObjectManager,我想我可以给他们传递不同的委托,并建立专用于处理来自不同baseUrls和ressourcePaths的返回值的类。这意味着我不得不在MyController和RestKit之上构建另一个抽象,这似乎也很混乱。 我有很强烈的感觉要以错误的方式进行操作,RestKit的源代码非常令人印象深刻,这表明我正在与框架进行斗争。我非常感谢您对此主题的一些最佳实践见解。我已经浏览了所有可以找到但没有看到上述用例的资源和示例。它始终是一个RKObjectManager,一个baseUrl和一个ressourcePath。 先感谢您。     
已邀请:
        由于尚无公认的答案:使用多个对象管理器使用ѭ​​3ѭ非常简单。 从Wiki(使用多个基本URL(和多个对象管理器)):   您创建的第一个对象管理器将是共享单例   RestKit默认使用。但是通过创建其他对象管理器,   您可以根据需要从其BaseURL中提取,只需确保保留   这些新经理。
RKObjectManager *flickrManager = 
    [RKObjectManager objectManagerWithBaseURL:flickrBaseUrl]; // <-- shared singleton
RKObjectManager *foursquareManager = 
    [[RKObjectManager objectManagerWithBaseURL:foursquareBaseUrl] retain]; // <-- you must retain every other instance.
  根据您的应用程序,您可能需要放置第二个对象   经理在更容易接近的地方,例如   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;
    // .......
}
    
        API变更:
RKObjectLoader* loader = [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@\"/whatever\" delegate:self];
无法在RestKit v.0.10.3中进行编译(loadObjectsAtResourcePath:delegate:返回void)。但是,该方法仅包装了几行代码,因此您仍然可以使用以下代码来访问加载器并添加userData:
RKObjectLoader *loader = [[RKObjectManager sharedManager] loaderWithResourcePath:resourcePath];
loader.userData = @\"SOMEDATA\";
loader.delegate = self;
loader.method = RKRequestMethodGET;
[loader send];
(添加注释,以防其他新用户遇到与我相同的问题)。     
        顺便说一下,由于RKRequest上也提供了userData属性,因此您可以使用相同的方法来加载/识别请求。 例如,一些发布请求:
RKClient * client = [RKClient sharedClient];
[client post:@\"/your-api-path\" usingBlock:^(RKRequest *request) {
    request.userData = @\"<some-object-you-can-check-in-delegate-callback>\";
    request.params = someParamsForRequest;
    request.delegate = <delegate you want to call when request is finished>;
}];
    
        如何使用objectLoader。 您将找到映射的对象类型/类
objectLoader.objectMapping.objectClass
,并基于它而不是url添加条件。
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
    // your condition based on -> objectLoader.objectMapping.objectClass   
}
希望对你有帮助     
        可能的方法是为每个基本url引入一个单调。 您可以实例化任意多个
RKObjectManager
对象。但是,只有第一个共享。查看ѭ12来源。
if (nil == sharedManager) {
    [RKObjectManager setSharedManager:self];
}
我们无法使用默认的
sharedManager
方法来定位特定的对象管理器,但我们可以轻松实现自己的单例。这是Google Maps对象管理器的示例:
@implementation GMObjectManager

+ (GMObjectManager*)sharedManager
{
    static GMObjectManager *manager;  // keep reference
    if (!manager) {
        // init with custom base url
        NSURL *baseUrl = [NSURL URLWithString:kGMBaseUrl];  
        manager = [GMObjectManager managerWithBaseURL:baseUrl];
    }

    return manager;
}

- (id)initWithHTTPClient:(AFHTTPClient *)client
{
    self = [super initWithHTTPClient:client];
    if (self) {
        // additional initialization
    }

    return self;
}

@end
用法:
CGObjectManager *googleMapsManager = [GMObjectManager sharedInstance];
    

要回复问题请先登录注册