2011-12-22 58 views
1

在此先感謝並道歉,因爲newbi問題。RestKit 0.9.3 app結構

我是restkit和ios開發的新手。

我的問題在哪裏把實體的映射。

在appdelegate ..我知道如何做到這一點,但我怎麼可以訪問任何viewcontroler的對象映射。

我也試圖在對象中做映射,但RKobject已被棄用,所以現在我必須從NSObject擴展{但我真的不知道在哪裏把映射與這種方法。

另外哪裏是最好的放置RKObjectManager的地方,我必須在每個視圖控制器中創建一個新的實例嗎?

希望你能幫助我特意繪製東西。

回答

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],在你的對象導入API .H

#import <RestKit/RestKit.h> 

編輯@Neruja Joseph:

  • BESessionManager是我的數據管理器,在那裏我保留了由Restkit加載的所有數據。這個對象是一個單身人士。因此,如果我導入這個對象,則此對象的單個實例可以在所有視圖中進行訪問:

    import「BESessionManager。H」

  • 所以,在我的回調函數,我保存的數據在我BESessionManager並且當它這樣做,我從我的回調函數發送通知:

    [NSNotificationCenter defaultCenter] postNotificationName:kSuccessLoginPostLogin對象:無];

  • 在我看來誰需要顯示的數據,或者使用數據我藉此依次是:

1 - 如果我使用restkit是第一次,當我開始應用,我初始化我restKit經理w^ith'映射''序列化'和全局選項作爲baseUrl,certificatValidation,serializationMIMEType,日誌配置,...我的BERestKitConfig也是單身人士。

2 - 如果我有登錄服務,我有另一個名爲BEServiceUser的單身人士,在這一個我爲每個相關服務添加一個方法登錄。我們可以有 - (空)postLogIn - (空)getLogout - (無效)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方法在我看來這是所謂的。所以我可以在我看來,數據從我的會話管理器,像這樣:

​​
+0

喜是相當清楚的感謝ü=),剛剛幾個問題,如果你有restkit的所有業務邏輯在層(未例如: - (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects AND 因此,如果我在我的appdelegate中使用[RKObjectManager sharedManager],那麼在我的viewcontrollers我只需要導入restkit.h是否正確? 謝謝!!! – IturPablo 2011-12-22 17:13:21

+0

對於第一個問題: 我在我的sessionManager中存儲返回的對象,它是一個單例,然後我發送一個notifaction。當我的viewController收到這個通知時,它會調用一個方法,然後在我的sessionManager中搜索數據。 – Beber 2011-12-22 17:35:58

+0

在您的viewController中使用[RKObjectManager sharedManager]在ExempleViewController.h中添加#import Beber 2011-12-22 17:39:13