我是Cocoa/Objective-C的新手。我使用Xcode4为MacOSX10.6编写代码(需要垃圾收集)。
我如何让下面的代码(基于苹果的sample code)更新我的图形用户界面,以便图形用户界面显示列出的文件数或文件名本身?我已经知道,我不能简单地创建一个标签的出口并更新标签的文本。进行NSLog调用的地方是我可能想要在图形用户界面中更新状态的地方。
我猜这会涉及到将任务放在其他进程/线程上?我读过一些关于使用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);
}
}发布于 2011-05-22 00:02:54
答案是使用NSOperationSample中演示的NSOperation。这包括将枚举放在NSOperation中,将其放在队列中,并使枚举循环发布窗口控制器注册观察的NSNotifications,以便当枚举器找到文件时,图形用户界面可以更新计数器和文件名表(建议的事件体系结构不太可能促进可读性)。在枚举循环中,它检查isCancelled标志以查看用户是否单击了图形用户界面中的“停止”按钮,如果是,则中断枚举。
发布于 2011-05-19 04:43:15
在这种情况下,您不需要NSTask。阅读有关Event Architecture的信息。如果正确组装了部件,则在运行诸如枚举之类的进程时,仍然可以响应用户事件。试试看。
https://stackoverflow.com/questions/6050396
复制相似问题