実行できることの1つは、属性を元の値から新しい値にマッピングする関数を持つカスタム移行ポリシークラスを作成することです。たとえば、モデルを複数のストアに分割できるように、代わりにitemIDを格納するために、「Items」と呼ばれる値のエンティティのセットに直接関係するMyItemsと呼ばれるエンティティをマップする必要がある場合がありました。
古いモデルは次のようになりました。

新しいモデルは次のようになります。

これを行うために、itemIDForItemNameという関数を使用してマッピングクラスを作成し、次のように定義しました。
@interface Migration_Policy_v1tov2 : NSEntityMigrationPolicy {
NSMutableDictionary *namesToIDs;
}
- (NSNumber *) itemIDForItemName:(NSString *)name;
@end
#import "Migration_Policy_v1tov2.h"
@implementation Migration_Policy_v1tov2
- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {
namesToIDs = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1],@"Apples",
[NSNumber numberWithInt:2],@"Bananas",
[NSNumber numberWithInt:3],@"Peaches",
[NSNumber numberWithInt:4],@"Pears",
[NSNumber numberWithInt:5],@"Beef",
[NSNumber numberWithInt:6],@"Chicken",
[NSNumber numberWithInt:7],@"Fish",
[NSNumber numberWithInt:8],@"Asparagus",
[NSNumber numberWithInt:9],@"Potato",
[NSNumber numberWithInt:10],@"Carrot",nil];
return YES;
}
- (NSNumber *) itemIDForItemName:(NSString *)name {
NSNumber *iD = [namesToIDs objectForKey:name];
NSAssert(iD != nil,@"Error finding ID for item name:%@",name);
return iD;
}
@end
次に、マッピングモデルの属性に関連するマッピング名として、関数呼び出しの結果として値式を指定します。
FUNCTION($entityPolicy,"itemIDForItemName:",$source.name)
**
また、その属性のマッピング名のカスタムポリシーフィールドをマッピングクラス名(この場合はMigration_Policy_v1tov2)に設定する必要があります。
**これはメソッドのセレクターシグネチャと一致する必要があることに注意してください
