iOS - 查找对象反转的最佳方法

时间:2012-10-03 18:53:14

标签: objective-c ios core-data recursion

我正在编写一个递归方法,它基本上遍历NSManagedObject对象并将其转换为JSON字典。我已经完成了大部分工作,但我遇到的问题是,当涉及到对象的逆时,方法会进入无限循环。

例如,假设该方法以一个具有Job类的对象开始,并且在该Job对象内部有一个名为survey的属性。调查是一个包含多个JobSurvey对象的NSSet。每个JobSurvey对象都包含一个反向原始Job对象的反转,该属性称为“Job”。

当我通过我的方法运行它时,它通过进入作业并开始处理每个属性来启动无限循环。一旦方法到达survey属性,它将再次被调用以按预期处理每个JobSurvey对象。然后,该方法处理每个属性,直到它到达Job(反向)对象。那时它将继续处理该对象,从而创建无限循环。

有关我如何解决这个问题的任何想法?我正在尝试编写此方法,而不必使用对象映射创建自定义对象类,因为它需要能够与我传入其中的任何类型的对象一起使用。以下是我到目前为止的代码。

- (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;
}

1 个答案:

答案 0 :(得分:0)

这就是我所做的。它类似于你想要实现的目标。

link to da codes

它比我想象的更明确,但我想我会建议。