基本的にNSManagedObjectオブジェクトをトラバースし、それをJSONディクショナリに変換する再帰メソッドを作成しています。私はこれの大部分を実行しましたが、オブジェクトの逆関数に関しては、メソッドが無限ループに陥るという問題が発生しています。
たとえば、メソッドがJobのクラスを持つオブジェクトで始まり、そのJobオブジェクトの中にsurveysというプロパティがあるとします。調査は、複数のJobSurveyオブジェクトを含むNSSetです。各JobSurveyオブジェクトには、元のJobオブジェクトとは逆のオブジェクトが含まれており、プロパティは「Job」と呼ばれます。
これをメソッドで実行すると、ジョブに入ると無限ループが開始され、各プロパティの処理が開始されます。メソッドがsurveysプロパティに到達すると、期待どおりに各JobSurveyオブジェクトを処理するために再度呼び出されます。次に、メソッドは、ジョブ(逆)オブジェクトに到達するまで各プロパティを処理します。その時点で、そのオブジェクトの処理を続行するため、無限ループが作成されます。
これを修正する方法について何か考えはありますか?このメソッドは、渡した任意のタイプのオブジェクトで使用できる必要があるため、オブジェクトマッピングを使用してカスタムオブジェクトクラスを作成せずに作成しようとしています。以下は私がこれまでに持っているコードです。
- (NSDictionary *)encodeObjectsForJSON:(id)object
{
NSMutableDictionary *returnDictionary = [[NSMutableDictionary alloc] init];
// get the property list for the object
NSDictionary *props = [VS_PropertyUtilities classPropsFor:[object class]];
for (NSString *key in props) {
// get the value for the property from the object
id value = [object valueForKey:key];
// if the value is just null, then set a NSNull object
if (!value) {
NSNull *nullObj = [[NSNull alloc] init];
[returnDictionary setObject:nullObj forKey:key];
// if the value is an array or set, then iterate through the array or set and call this method again to encode it's values
} else if ([value isKindOfClass:[NSArray class]] || [value isKindOfClass:[NSSet class]]) {
NSMutableArray *retDicts = [[NSMutableArray alloc] init];
// encode each member of the array to a JSON dictionary
for (id val in value) {
[retDicts addObject:[self encodeObjectsForJSON:val]];
}
// add to the return dictionary
[returnDictionary setObject:retDicts forKey:key];
// else if this is a foundation object, then set it to the dictionary
} else if ([value isKindOfClass:[NSString class]] || [value isKindOfClass:[NSNumber class]] || [value isKindOfClass:[NSNull class]] || [value isKindOfClass:[NSDate class]]) {
[returnDictionary setObject:value forKey:key];
// else this must be a custom object, so call this method again with the value to try and encode it
} else {
NSDictionary *retDict = [self encodeObjectsForJSON:value ];
[returnDictionary setObject:retDict forKey:key];
}
}
return returnDictionary;
}