2013-04-11 4 views
0

여기에 다소 간단한 해결책이 있다는 것을 알고 있습니다.하지만 제 머리를 감쌀 수는 없습니다. 사용자가 생성 한 .plist 파일에는 합리적인 무한대의 중첩 트리가 포함될 수 있습니다. 내가하고 싶은 일은 plist가 중첩 된 방식에 기반한 폴더 구조를 만드는 것입니다. 나는 기본 사전은 내가 그것을 통해 어떻게 루프를 파악하고 다음 디렉토리를 생성하는에 뛰어와 그 안에 디렉토리를 작성하도록 지시 어차피 어떻게되는지 깊이 알 수 없기 때문에중첩 된 NSDictionary를 통한 반복

.plist example

.

나는 전체 목록을 반복하는 폴더를 만드는 법을 알고 있으며, 나를 벗어 던지고있다. 나는 어디에서 시작 해야할지 확실하지 않은 별도의 재귀 적 메소드가 필요하다고 확신한다. 키 "Children"과 "Name"은 내가 목록을 만드는 데 사용하는 것입니다. 어떤 도움이라도 좋을 것입니다.

+1

재귀 난 후였다 그냥 뭐, 완벽 친구 –

답변

1

디렉토리 구조를 만들 디렉토리의 경로를 정의하는 것으로 시작합니다. 그런 다음 함수를 호출하여 디렉토리 구조를 작성하십시오.

NSString *pathToDirectory = @"./"; 
[self buildDirectoriesAtPath: pathToDirectory fromDictionary: dictionary]; 

기능 -buildDirectoriesAtPath:fromDictionary:은 재귀와 같은 것을 보일 것이다 :

- (void) buildDirectoriesAtPath: (NSString *) filepath fromDictionary: (NSDictionary *) dictionary { 

    for (NSString *key in dictionary.allKeys) { 

     if ([key isEqualToString: @"Children"]) { 

      NSArray *children = [dictionary objectForKey: key]; 
      for (id object in children) { 

       if ([object isKindOfClass: [NSDictionary class]]) { 
        NSDictionary *directoryInfo = (NSDictionary *) object; 
        NSString *directoryName = [directoryInfo objectForKey: @"Name"]; 
        NSString *directoryPath = [NSString stringWithFormat: @"%@%@", filepath, directoryName]; 

        // Create directory 
        NSLog(@"Creating directory: %@", directoryPath); 

        // Create subdirectories 
        NSArray *subdirectories = [directoryInfo objectForKey: @"Children"]; 
        for (id directory in subdirectories) { 

         if ([directory isKindOfClass: [NSString class]]) { 
          NSString *subdirectoryName = (NSString *) directory; 
          NSString *subdirectoryPath = [NSString stringWithFormat: @"%@/%@", directoryPath, subdirectoryName]; 

          // Create directory 
          NSLog(@"Creating directory: %@", subdirectoryPath); 
         } 
         else if ([directory isKindOfClass: [NSDictionary class]]) { 
          NSDictionary *subdirectory = (NSDictionary *) directory; 
          NSString *subdirectoryName = [subdirectory objectForKey: @"Name"]; 
          NSString *subdirectoryPath = [NSString stringWithFormat: @"%@/%@/", directoryPath, subdirectoryName]; 

          [self buildDirectoriesAtPath: subdirectoryPath fromDictionary: (NSDictionary *) directory]; 
         } 
        } 
       } 
       else if ([object isKindOfClass: [NSString class]]) { 
        NSString *directoryName = (NSString *) object; 
        NSString *directoryPath = [NSString stringWithFormat: @"%@%@", filepath, directoryName]; 

        // Create directory 
        NSLog(@"Creating directory: %@", directoryPath); 
       } 
      } 
     } 
    } 
} 

이에 명확히 싶은 기능이 있다면이 물어 주저하지 말고합니다. :)

+0

이며,이 기능을 사용하면 도움이 될 수 있음. 고맙습니다! –

1

void recursiveCall (NSDictionary *dictionary) { 
    NSArray *_keys = [dictionary allKeys]; 
    for (NSString *_key in _keys) { 
     id obj = [dictionary valueForKey:_key]; 
     NSLog(@"Create folder of %@",_key); 
     if ([obj isKindOfClass:[NSArray class]]) { 
      for (id _obj in obj) { 
       if ([_obj isKindOfClass:[NSDictionary class]]) { 
        recursiveCall(_obj); 
       } 
       else { 
        NSLog(@"Create folder of %@",_obj); 
       } 
      } 
     } 

    } 
}