首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用Cocoa NSDirectoryEnumerator列出目录内容时显示文件或进度?

如何在使用Cocoa NSDirectoryEnumerator列出目录内容时显示文件或进度?
EN

Stack Overflow用户
提问于 2011-05-19 04:06:30
回答 2查看 853关注 0票数 1

我是Cocoa/Objective-C的新手。我使用Xcode4为MacOSX10.6编写代码(需要垃圾收集)。

我如何让下面的代码(基于苹果的sample code)更新我的图形用户界面,以便图形用户界面显示列出的文件数或文件名本身?我已经知道,我不能简单地创建一个标签的出口并更新标签的文本。进行NSLog调用的地方是我可能想要在图形用户界面中更新状态的地方。

我猜这会涉及到将任务放在其他进程/线程上?我读过一些关于使用NSTask、多线程和GCD进行多处理的文章。除了多线程(我想避免),我真的不知道我应该使用哪一个。我认为我可以拼凑一些东西,但我更喜欢用一种最优的或推荐的方式(并快速实现它)。

我的印象是NSTask将适合我的简单需求?

我还想让用户选择暂停或取消长期运行的任务。

提前谢谢。

代码:

代码语言:javascript
复制
NSArray *keys = [NSArray arrayWithObjects:
    NSURLIsDirectoryKey, NSURLIsPackageKey, NSURLLocalizedNameKey, nil]; 

NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] 
                                    enumeratorAtURL:directoryURL
                         includingPropertiesForKeys:keys 
                                            options:(NSDirectoryEnumerationSkipsHiddenFiles) 
                                       errorHandler:^(NSURL *url, NSError *error) { 
                                           // Handle the error.
                                           // Return YES if the enumeration should continue after the error. 
                                     return YES; 
                                       }
                                    ]; 

for (NSURL *url in enumerator) { 
    // Error-checking is omitted for clarity. 

    NSNumber *isDirectory = nil; 
    [url getResourceValue:&isDirectory forKey:NSURLIsDirectoryKey error:NULL]; 

    if ([isDirectory boolValue]) { 
        NSString *localizedName = nil; 
        [url getResourceValue:&localizedName forKey:NSURLLocalizedNameKey error:NULL]; 

        NSNumber *isPackage = nil; 
        [url getResourceValue:&isPackage forKey:NSURLIsPackageKey error:NULL]; 

        if ([isPackage boolValue]) { 
            NSLog(@"Package at %@", localizedName); 
        } 
        else { 
            NSLog(@"Directory at %@", localizedName); 
        }
    }
    else {
        NSLog(@"File at %@", url);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2011-05-22 00:02:54

答案是使用NSOperationSample中演示的NSOperation。这包括将枚举放在NSOperation中,将其放在队列中,并使枚举循环发布窗口控制器注册观察的NSNotifications,以便当枚举器找到文件时,图形用户界面可以更新计数器和文件名表(建议的事件体系结构不太可能促进可读性)。在枚举循环中,它检查isCancelled标志以查看用户是否单击了图形用户界面中的“停止”按钮,如果是,则中断枚举。

票数 1
EN

Stack Overflow用户

发布于 2011-05-19 04:43:15

在这种情况下,您不需要NSTask。阅读有关Event Architecture的信息。如果正确组装了部件,则在运行诸如枚举之类的进程时,仍然可以响应用户事件。试试看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6050396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档