2012-03-28 18 views
0

我想了解來自Apple「ComplexBrowser」的示例,但它很難找到任何材料/教程「CFURLEnumeratorCreateDirectoryURL」。可可NSBrowser和CFURLEnumeratorCreateDirectoryURL

ComplexBrowser Sample from Apple

究竟在這段代碼是怎麼回事?

我不明白這種循環CFURLEnumeratorGetNextURL和東西的方式。

對我來說,NSFileManager的方法似乎更簡單,但更有限?

NSArray *contentsAtPath = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:parentPath error:NULL];

- (NSArray *)children { 
if (_children == nil || _childrenDirty) { 
    // This logic keeps the same pointers around, if possible. 
    NSMutableArray *newChildren = [NSMutableArray array]; 

    CFURLEnumeratorRef enumerator = CFURLEnumeratorCreateForDirectoryURL(NULL, (CFURLRef) _url, kCFURLEnumeratorSkipInvisibles, (CFArrayRef) [NSArray array]); 
    NSURL *childURL = nil; 
    CFURLEnumeratorResult enumeratorResult; 
    do { 
     enumeratorResult = CFURLEnumeratorGetNextURL(enumerator, (CFURLRef *) &childURL, NULL); 
     if (enumeratorResult == kCFURLEnumeratorSuccess) { 
      FileSystemNode *node = [[[FileSystemNode alloc] initWithURL:childURL] autorelease]; 
      if (_children != nil) { 
       NSInteger oldIndex = [_children indexOfObject:childURL]; 
       if (oldIndex != NSNotFound) { 
        // Use the same pointer value, if possible 
        node = [_children objectAtIndex:oldIndex]; 
       } 
      } 
      [newChildren addObject:node]; 
     } else if (enumeratorResult == kCFURLEnumeratorError) { 
      // A possible enhancement would be to present error-based items to the user. 
     } 
    } while (enumeratorResult != kCFURLEnumeratorEnd); 

    [_children release]; 
    _childrenDirty = NO; 
    // Now sort them 
    _children = [[newChildren sortedArrayUsingComparator:^(id obj1, id obj2) { 
     NSString *objName = [obj1 displayName]; 
     NSString *obj2Name = [obj2 displayName]; 
     NSComparisonResult result = [objName compare:obj2Name options:NSNumericSearch | NSCaseInsensitiveSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch range:NSMakeRange(0, [objName length]) locale:[NSLocale currentLocale]]; 
     return result; 
    }] retain]; 
} 

return _children; 

}

+0

歡迎來到Stack Overflow(SO)!請點擊問題旁邊的箭頭接受幫助您的答案。因此告訴別人哪個答案是正確的,並且感謝那些給予他們聲望點的幫助你的人! – lnafziger 2012-03-30 20:59:01

回答

1

由於此信息存儲在一個不透明的C數據類型,在覈心基礎,它們提供的C例程,給你關於數據的信息。這是一種封裝形式,以便他們可以在幕後改變事物,而不會影響庫的公共接口。

基本上,它們創建一個循環並不斷詢問目錄中的下一個URL,直到找到目錄的結尾。

  • enumerator是一種索引,可以跟蹤它們在URL列表中的位置。
  • enumeratorResult告訴我們我們是否有一個新的URL(或有 是一個錯誤,或者我們在最後一個記錄)。

當它經過的每個URL,它創建FileSystemNode的並將它們添加到一個數組,然後返回,當它完成通過所有的URL在目錄中的循環數組。

+0

@RafaelCordoba這個回答你的問題? – lnafziger 2012-04-04 03:19:16

+0

是的,它回答了我的問題,我明白這個普查員是如何工作的。謝謝! – 2012-04-11 05:26:40