【发布时间】:2011-09-05 22:06:47
【问题描述】:
编辑
我阅读了一些关于块和快速枚举以及 GCD 之类的文章。 @Bbum 写了很多关于 GCD 和块主题的文章,他说块枚举方法总是比快速枚举等效方法快或快。你可以阅读他的推理here。
虽然这是一次引人入胜的智慧对话,但我同意那些说这真的取决于手头的任务的人的观点。
我有一些任务要完成,我需要快速、廉价且高效地完成它们。 Apple 为我们提供了许多选择来枚举数组的方式,但我不确定该选择哪一个。
快速枚举
for (id obj in array)
{
/* Do something with |obj|. */
}
非并发块枚举
[array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
并发块枚举
[array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
GCD 应用
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_apply([array count], queue, ^(size_t idx) {
id obj = [array objectAtIndex: idx];
/* Do something with |obj|. */
});
GCD 异步应用
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^(void) {
dispatch_apply([array count], queue, ^(size_t idx) {
id obj = [array objectAtIndex: idx];
/* Do something with |obj|. */
});
});
或者可能是NSBlockOperations 或NSOperationQueue?
TIA,亚历克斯。
【问题讨论】:
-
你能比较异步和非异步调用吗? “高效”的标准是什么? “便宜”和“快”一样重要吗?等等... :) 如果有更多关于您的特定场景的信息可能会有所帮助?
-
那我可以比较一下是什么意思?我在 iOS 上执行此枚举,因此它需要高效且快速,但相同的一般概念也应适用于 Mac OS X。就 iOS 而言,你的资源更少,所以我试图尽可能提高效率。就是这样。
-
您的问题没有单一、绝对的答案。我投票关闭它。
-
基准,基准,基准,基准,基准。然后再做一次。
标签: objective-c arrays enumeration grand-central-dispatch objective-c-blocks