Структура приложения RestKit 0.9.3

заранее спасибо и извинения, потому что вопросы новичка.

Я новичок в разработке restkit и ios.

Мой вопрос, где разместить сопоставление сущностей.

В appdelegate.. Я знаю, как это сделать, но как я могу получить доступ к сопоставлению объектов из любого контроллера просмотра.

Я также пытался сделать сопоставление в объекте, но RKobject устарел, поэтому теперь мне нужно расширить его из NSObject {, но я действительно не знаю, куда поместить сопоставление с этим подходом.

Кроме того, где лучше всего разместить RKObjectManager, нужно ли мне создавать новый экземпляр в каждом контроллере представления?

Надеюсь, вы можете помочь мне особенно с картографией.


person IturPablo    schedule 22.12.2011    source источник


Ответы (1)


для использования RKObjectManager вы создаете экземпляр только при вызове метода objectManagerWithBaseURL. В вашем приложенииDelegate.

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] для установки своего сопоставления, я не создаю другой экземпляр.

Это зависит от структуры кода, но я не использую Restik напрямую в своем ViewController, но у меня есть слой, который управляет 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] импортируйте API в свой объект .h

#import <RestKit/RestKit.h>

Редактировать @Neruja Joseph:

  • BESessionManager — это мой менеджер данных, в котором я храню все данные, загружаемые Restkit. Этот объект является синглтоном. Таким образом, единственный экземпляр этого объекта может быть доступен во всех моих представлениях, если я импортирую этот:

    импортировать "BESessionManager.h"

  • Итак, в моей функции обратного вызова я сохраняю данные в своем BESessionManager, и когда это делается, я отправляю уведомление из своей функции обратного вызова:

    [[NSNotificationCenter defaultCenter] postNotificationName: объект kSuccessLoginPostLogin: ноль];

  • На мой взгляд, кому нужно отображать данные или использовать данные, я принимаю это по порядку:

1 - Если я использую restkit в первый раз, когда я запускаю приложение, я запускаю свой менеджер restKit с «отображением», «сериализацией» и глобальными параметрами, такими как baseUrl, certificatValidation, serializationMIMEType, конфигурация журнала, ... есть мой 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

например, в моем представленииDidLoad:

[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;
person Beber    schedule 22.12.2011
comment
привет, все понятно, спасибо =), всего пара вопросов, если у вас есть вся бизнес-логика ресткита в слое (не в представлении), как получить ответ ресткита, например: - (void)objectLoader:( RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects И Итак, если я использую [RKObjectManager sharedManager] в своем делегате приложения, то в моих контроллерах представления мне нужно только импортировать restkit.h, это правильно?.. Спасибо!!! - person IturPablo; 22.12.2011
comment
По первому вопросу: я храню возвращенные объекты в своем менеджере сеансов, который является синглтоном, а затем отправляю уведомление. Когда мой viewController получает это уведомление, он вызывает метод, который затем будет искать данные в моем sessionManager. - person Beber; 22.12.2011
comment
Для использования [RKObjectManager sharedManager] в вашем viewController добавьте #import ‹RestKit/RestKit.h› в ExempleViewController.h - person Beber; 22.12.2011
comment
Привет, спасибо, я следовал твоим хитростям, и твоя структура приложения отлично работает, спасибо .. - person IturPablo; 24.12.2011