Objective c 一次有多个RKObjectManager(RestKit)

Objective c 一次有多个RKObjectManager(RestKit),objective-c,ios,restkit,Objective C,Ios,Restkit,我正在测试RestKit,需要访问不同的baseUrl,有时还需要“同时”从不同的位置访问具有相同baseUrl的web服务,最后我还需要在同一控制器中使用不同的ResSourcePath访问相同的baseUrl 在我的AppDelegate中,我像这样设置RKObjectManager单例 RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kBaseUrl]; [objectManager re

我正在测试RestKit,需要访问不同的baseUrl,有时还需要“同时”从不同的位置访问具有相同baseUrl的web服务,最后我还需要在同一控制器中使用不同的ResSourcePath访问相同的baseUrl

在我的AppDelegate中,我像这样设置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只有一个

如果我能做到这一点,并能有不同的管理者,另一个问题就会出现。 委托方法didLoadObjects和didFailWithError将从两个RkObjectManager接收结果,除了从它们的BaseURL之外,我看不到任何其他方法来区分它们。在delegate方法中将每个返回值与baseUrl进行比较,更糟糕的是,将resourcePath与之进行比较,这对我一点都不感兴趣

若我有不同的RKObjectManager,我想我可以给他们传递不同的委托,并构建专门用于处理来自不同BaseURL和ResourcePath的返回值的类。这意味着我必须在MyController和RestKit之上构建另一个抽象,这看起来也很混乱

我有一种强烈的感觉,我正在以错误的方式处理这个问题,RestKit源代码给人留下了深刻的印象,这表明我正在与框架作斗争。我真的很想了解一些关于这个主题的最佳实践见解。我已经阅读了所有我可以找到的资源和示例,但是没有看到上面的用例。它始终是一个RKObjectManager、一个baseUrl和一个ressourcePath


提前谢谢。

因为还没有公认的答案:使用
RestKit
使用多对象管理器非常简单

从()开始:

您创建的第一个对象管理器将是共享单例 RestKit默认使用。但是通过创建额外的对象管理器, 您可以根据需要从它们的BaseURL中提取,只需确保保留 这些新经理


顺便说一下,由于userData属性也可用于RKRequest,因此可以使用相同的方法加载/标识请求

例如,一些post请求:

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>;
}];
RKClient*client=[RKClient sharedClient];
[客户端post:@/您的api路径”使用block:^(RKRequest*请求){
request.userData=@;
request.params=someParamsForRequest;
request.delegate=;
}];
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];

(如果其他新用户遇到与我相同的问题,请添加注释)。

使用objectLoader如何。 您将找到映射的对象类型/Class
objectLoader.objectMapping.objectClass
,并基于它而不是url添加条件

-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
    // your condition based on -> objectLoader.objectMapping.objectClass   
}
希望它能有所帮助

可能的方法是为每个基本url引入一个单音

您可以根据需要实例化任意多个
RKObjectManager
对象。但是,只有第一个将成为共享。查看
initWithHTTPClient:

我们不能使用默认的
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];

我也在调查这件事。你能想出解决办法吗?嗨,格雷格,是的。(restkit谷歌集团是restkit特定内容的更好场所)。其基本思想是,只有第一个URL是单例基URL,之后您可以根据需要实例化任意多个新的ObjectManager,只需在每个API调用的基础上执行。谢谢:)你把这篇文章挖掘出来,并用一个很好的例子来回答它。所以诀窍就是使用Retain。。。好啊但是在我的ARC代码中,什么是正确的方法来实现这一点,因为ARC中不允许保留?Pascal-您可以在AppDelegate中添加ObjectManager,比如说一个NSArray属性,并使其强大。我喜欢RestKit,但我不认为这是最佳实践;共享管理器通常是作为单一实例的唯一实例,而不是许多实例中的第一个:它不再是单一实例。感谢你澄清了一些违反直觉的事情
if (nil == sharedManager) {
    [RKObjectManager setSharedManager:self];
}
@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];