【问题标题】:RestKit 0.9.3 app StructureRestKit 0.9.3 应用结构
【发布时间】:2012-01-26 05:17:49
【问题描述】:

在此先感谢并道歉,因为 newbi 问题。

我是 restkit 和 ios 开发的新手。

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

在 appdelegate.. 我知道如何做到这一点,但我怎样才能从任何视图控制器访问对象映射。

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

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

希望你能在映射的事情上特别帮助我。

【问题讨论】:

    标签: ios mapping restkit


    【解决方案1】:

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

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

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

    [RKObjectManager sharedManager].serializationMIMEType = RKMIMETypeJSON;
    

    我个人制作一个对象只是为了管理映射,我可以给你一个我的登录映射方法的例子:

    -(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的层,在我看来我调用了与资源对应的方法。

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

    编辑其他问题:

    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 对象:nil];

    • 在我看来谁需要显示数据,或者使用数据我按顺序来:

    1 - 如果我第一次使用 restkit,当我启动应用程序时,我会使用“映射”、“序列化”和全局选项作为 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;
    

    【讨论】:

    • 嗨很清楚谢谢你=),只是几个问题,如果你有一个层(不在视图中)restkit的所有业务逻辑,你如何获得restkit响应,例如: - (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects AND 所以如果我在我的 appdelegate 中使用 [RKObjectManager sharedManager] 那么在我的视图控制器中我只需要导入 restkit.h 对吗?.. 谢谢你!!!
    • 对于第一个问题:我将返回的对象存储在我的单例会话管理器中,然后我发送一个通知。当我的 viewController 收到这个通知时,它会调用一个方法,然后在我的 sessionManager 中搜索数据。
    • 在您的 viewController 中使用 [RKObjectManager sharedManager] 在 ExempleViewController.h 中添加 #import
    • 嘿,谢谢,我遵循了你的诡计,你的应用程序结构很好,谢谢..
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2014-08-25
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多