2011-08-25 156 views
8
我使用RestKit一個項目

最好的地方,我注意到,有不再是你可以控制所有的映射(elementToPropertyMappings)類的方法,所以我想知道其中的把新的代碼最好的地方是,我目前做這件事在我的視圖控制器,但我會用最我的代碼其他地區相同的映射關係,從而有把它更有效率的地方:哪裏是把對象映射在RestKit

我所指的代碼是:

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[User class]]; 
[userMapping mapKeyPath:@"id" toAttribute:@"identifier"]; 
[userMapping mapKeyPath:@"forename" toAttribute:@"forename"]; 
[userMapping mapKeyPath:@"surname" toAttribute:@"surname"]; 
[userMapping mapKeyPath:@"email" toAttribute:@"email"]; 
[userMapping mapKeyPath:@"twitter_username" toAttribute:@"twitterUsername"]; 
[userMapping mapKeyPath:@"created" toAttribute:@"created"]; 
[userMapping mapKeyPath:@"use_gravatar" toAttribute:@"useGravatar"]; 
[userMapping mapKeyPath:@"avatar_url" toAttribute:@"avatarURL"]; 
[userMapping mapKeyPath:@"gender" toAttribute:@"gender"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:userMapping forKeyPath:@"user"]; 

這將是巨大的,如果這可能是在用戶類中的方法,我可以再調用設置這些地圖坪等

非常感謝

回答

9

有幾個很好的方式來組織你的映射目前推薦:

  1. 把你所有的映射到您的應用程序代理,並在應用程序初始化配置。這將它們排除在控制器之外,並且在映射數量少的情況下非常有用。
  2. 子類的RKObjectMappingProvider和建設都在你的子類的init方法的映射,然後實例化你的映射提供程序實例分配給對象管理器。
  3. 添加類別RKObjectMappingProvider與像「defineMappings」的方法。然後將頭文件導入到您的應用程序委託中,並在初始化RestKit後通過[mappingProvider defineMappings]調用它。

在類方法上定義映射的問題在於,當你有關係時,可以用循環依賴關閉,因爲沒有ivars可用於存儲實例。我們或許可以用塊做些事情來幫助緩解這個問題,但是還沒有完成這樣的工作。

+1

在過去,我剛剛創建了一個RestKitManager和一個MappingsManager對象來將設置移出我的應用程序委託。映射管理器保持對我定義的每個映射的引用,它爲RestKitManager提供了一個單一的入口點來啓動和設置映射,以便RestKitManager和AppDelegate都不需要知道任何關於涉及的實體數量。 *然而,*映射提供者的子類似乎是一種更優雅的方法。我以前沒有考慮過這個。 –

+0

不想劫持這個問題我問了一個非常密切相關的問題在這裏:http://stackoverflow.com/questions/7399095/where-to-put-object-mappings-in-restkit – Glenn

1

我通常會創建我的應用程序委託私人的方法,我的應用程序設置,其中設置了RKObjectManager,然後構建所有我整個應用程序使用的映射過程中調用。我相信RestKit示例項目使用這種相同的模式,所以絕對檢查這些作爲參考。

3

我認爲,領域模型應該是唯一一個誰應該知道的映射。 這裏是我如何映射一些Flickr的JSON:

我所說的映射當你需要他們(可以在AppDelegate中或在任何你想要的)

// Setup our object mappings 
RKObjectMapping *photoMapping = [Photo mapWithMapping:nil]; 
RKObjectMapping *photosMapping = [Photos mapWithMapping:photoMapping]; 

這是我的域對象之一: 它包含進行映射的classMethod。

#import "Photos.h" 
@implementation Photos 

+ (RKObjectMapping*)mapWithMapping: (RKObjectMapping*)aMapping 
{ 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    RKManagedObjectMapping *mapping = [RKManagedObjectMapping mappingForClass:[self class] inManagedObjectStore:objectManager.objectStore]; 

    [mapping mapKeyPathsToAttributes: 
     @"page", @"page", 
     @"pages", @"pages", 
     @"perpage", @"perpage", 
     @"stat", @"stat", 
     @"total", @"total", 
    nil]; 

    if (aMapping) { 
     [mapping mapRelationship:@"photo" withMapping:aMapping]; 
    } 

    return mapping; 
} 

@end