gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:16:10 25 4
gpt4 key购买 nike

我是 Cocoa/Objective-C 的新手。我正在使用 Xcode 4(并且需要垃圾收集)针对 Mac OS X 10.6 进行编码。

如何让以下代码(基于 Apple 的 sample code )更新我的 GUI,以便 GUI 显示列出的文件计数或文件名本身?我已经知道我不能只创建标签的导出并更新标签的文本。进行 NSLog 调用的位置是我可能想要更新 GUI 中的状态的位置。

我猜测这将涉及将任务放在其他进程/线程上?我已经阅读了一些有关使用 NSTask、多线程和 GCD 进行多处理的文章。除了多线程(我想避免)之外,我真的不知道应该使用哪个。我想我可以把一些东西整合在一起,但更喜欢以最佳或推荐的方式来做(并快速实现)。

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

我还想为用户提供暂停或取消长时间运行的任务的选项。

提前致谢。

代码:

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

最佳答案

答案是使用 NSOperation,如 NSOperationSample 中所示。 。这涉及到将枚举放入 NSOperation 中,将其放在队列中,并让枚举循环发布 NSNotifications,窗口 Controller 注册以观察这些通知,以便 GUI 可以更新计数器和文件名表(建议的事件架构不太可能实现)以便于在枚举器查找文件时方便地i)。在枚举循环内,它检查 isCancelled 标志以查看用户是否单击了 GUI 中的“停止”按钮,如果是,则退出枚举。

关于objective-c - 如何在使用 Cocoa NSDirectoryEnumerator 列出目录内容时显示文件或进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6050396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com