RestKit 0.9.3 app结构

时间:2011-12-22 15:28:36

标签: ios mapping restkit

提前感谢并道歉,因为newbi问题。

我是restkit和ios开发的新手。

我的问题在哪里放置实体的映射。

  

在appdelegate中..我知道如何做到这一点但是如何从任何viewcontroler访问对象映射。

     

我也尝试在对象中进行映射,但RKobject已被弃用,所以现在我必须从NSObject扩展{但我真的不知道在哪里放置这种方法的映射。

     

在哪里放置RKObjectManager的最佳位置,我是否必须在每个视图控制器中创建一个新实例?

希望你能特别帮我解决映射问题。

1 个答案:

答案 0 :(得分:1)

对于使用RKObjectManager,只有在调用objectManagerWithBaseURL方法时才创建实例。在你的appDelegate。

RKObjectManager * restKitManager = [RKObjectManager objectManagerWithBaseURL:@"http://toto/v1/ui"];

在您可以使用[RKObjectManager sharedManager]访问管理器之后,只需在您想要使用它的对象中导入RestKit:

[RKObjectManager sharedManager].serializationMIMEType = RKMIMETypeJSON;

就个人而言,我只是为了管理映射而创建一个Object,我可以为你的登录映射方法提供一个例子:

-(void)mappingLogin
{
log_debug("mappingLogin")
RKObjectMapping * userMapping = [RKObjectMapping mappingForClass:[VOUser class]];
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[userMapping mapKeyPath:@"ref" toAttribute:@"ref"];
[userMapping mapKeyPath:@"login" toAttribute:@"login"];
[userMapping mapKeyPath:@"mail" toAttribute:@"mail"];


RKObjectMapping * gatewayMapping = [RKObjectMapping mappingForClass:[VOGateway class]];
[gatewayMapping mapKeyPath:@"id" toAttribute:@"identifier"];
[gatewayMapping mapKeyPath:@"serial" toAttribute:@"serial"];
[gatewayMapping mapKeyPath:@"status" toAttribute:@"status"];

RKObjectMapping * authReturnMapping = [RKObjectMapping mappingForClass:[VOAuth class]];
[authReturnMapping mapKeyPath:@"sessionId" toAttribute:@"sessionId"];
[authReturnMapping mapKeyPath:@"user" toRelationship:@"user" withMapping:userMapping];
[authReturnMapping mapKeyPath:@"gateway" toRelationship:@"gateway" withMapping:gatewayMapping];

[[RKObjectManager sharedManager].mappingProvider setMapping:authReturnMapping forKeyPath:@""];

}

如果您看到最后一行,您可以看到我使用[RKObjectManager sharedManager]来设置我的映射,我不会创建其他实例。

这取决于代码的结构,但我不在我的viewsController中直接使用restik,但是我有一个管理RestKit的层,在我的视图中,我调用了与resouces相对应的方法。

如果你想澄清一些观点,请告诉我。 (如果您需要一些帮助来处理您想要映射的特定示例详细信息)。

编辑其他问题:

1)使用返回对象的例子:

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects {

    log_debug("##### BackEnd - %@ - %i #####",objectLoader.resourcePath,objectLoader.response.statusCode)

    if ([objectLoader.response isSuccessful]) {

        if ([objectLoader wasSentToResourcePath:@"/auth"]) {
            VOAuth * auth = [objects objectAtIndex:0];
            [BESessionManager getInstance].auth = auth;
            [[NSNotificationCenter defaultCenter] postNotificationName:kSuccessLoginPostLogin object: nil];
        } else if ([objectLoader wasSentToResourcePath:@"/list1/0"]) {
            log_debug("count %i",[objects count])
        }

    } 

}

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error {

    log_debug("!!!!! BackEnd - %@ - %i !!!!!",objectLoader.resourcePath,objectLoader.response.statusCode)

    if ([objectLoader wasSentToResourcePath:@"/auth"]) {
        [[NSNotificationCenter defaultCenter] postNotificationName:kErrorLoginPostLogin object: nil];
    }

}

2)使用[RKObjectManager sharedManager],在Object .h

中导入API
#import <RestKit/RestKit.h>

编辑@Neruja Joseph:

  • BESessionManager是我的数据管理器,我保留了Restkit加载的所有数据。这个对象是单身人士。因此,如果我导入此对象,则可以在我的所有视图中访问此对象的单个实例:

    导入“BESessionManager.h”

  • 所以,在我的回调函数中,我将数据保存在我的BESessionManager中,当它完成后,我从我的回调函数发送通知:

    [[NSNotificationCenter defaultCenter] postNotificationName:kSuccessLoginPostLogin object:nil];

  • 在我看来,谁需要显示数据或使用数据我按顺序执行此操作:

1 - 如果我第一次使用restkit,当我启动应用程序时,我使用'mapping''序列化'和全局选项作为baseUrl,certificatValidation,serializationMIMEType,日志配置来启动我的restKit管理器...有我的BERestKitConfig也是单身人士。

2 - 如果我有登录服务,我有另一个名为BEServiceUser的单例,在这一个我为每个相关服务添加一个方法进行登录。我们可以 - (void)postLogIn - (void)getLogout - (void)getUserInfo ...

#import <Foundation/Foundation.h>

// Mandatory class for services
#import <RestKit/RestKit.h>
#import "BESessionManager.h"
#import "BERestKitConfig.h"

// Value Objects
#import "VOUser.h"
#import "VOGateway.h"
#import "VOAuth.h"

// Send Objects
#import "SOAuth.h"


@interface BEServiceUser : NSObject <RKObjectLoaderDelegate> {
    SOAuth * logObj;
}

@property (nonatomic, retain) SOAuth * logObj;

//Singleton
+(BEServiceUser *)getInstance;
+(void)resetInstance;

// CallBack
-(void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects;
-(void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error;

// Services
-(void)postLogin:(NSString*)login  withPassword:(NSString*)password;
-(void)getLogout;

@end

例如我的viewDidLoad:

[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(onLoginSuccess) name: kSuccessLoginPostLogin object: nil];
[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(onLoginError) name: kErrorLoginPostLogin object: nil];
[[BEServiceUser getInstance] postLogin:@"toto" withPassword:@"toto"];

3 - 如果结果良好,在我的视图中调用onLoginSuccess方法。所以我可以从我的会话管理器中查看我的视图中的数据:

[BESessionManager getInstance].auth;