Iphone 如何并行处理数组
因此,有许多方法可以通过选择器或代码块来运行数组的所有元素<代码>makeObjectsPerformSelector:等 如果您手头有4或16个内核,那么您可能希望将所有处理发送到不同的进程 即使在iOS上,也可以明智地将它们全部送走,或者至少让它们随风而去 在可可环境中,什么是最好、最整洁的方法Iphone 如何并行处理数组,iphone,cocoa,Iphone,Cocoa,因此,有许多方法可以通过选择器或代码块来运行数组的所有元素makeObjectsPerformSelector:等 如果您手头有4或16个内核,那么您可能希望将所有处理发送到不同的进程 即使在iOS上,也可以明智地将它们全部送走,或者至少让它们随风而去 在可可环境中,什么是最好、最整洁的方法 同样,如果您希望在任何时候发送它们以完成,即执行以下指令之前不要等待枚举完成,…?如果您可以针对iOS 4+或Mac OS X 10.6+,请使用Grand Central Dispatch(我使用一个类别
同样,如果您希望在任何时候发送它们以完成,即执行以下指令之前不要等待枚举完成,…?如果您可以针对iOS 4+或Mac OS X 10.6+,请使用Grand Central Dispatch(我使用一个类别,因为我认为它们很酷):
如果需要并发和同步行为(即,在执行以下指令之前等待枚举完成),
-[NSArray enumerateObjectsWithOptions:usingBlock://code>将在传递NSEnumerationConcurrent
选项时执行此操作。此方法在Mac OS 10.6+和iOS 4.0+上可用
如果需要异步行为,可以使用标准多线程解决方案之一,如NSOperation或GCD,并结合-EnumerateObjectsWithoOptions:usingBlock:
。比如说,
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[array enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// do something with obj
}];
});
@Joe我昨天回答了:)@Joe0,0
用于获取默认优先级的全局队列(0
),第二个参数始终为0(因为文档这么说)。如果你在变量myBlock
中有一个块,你可以这样调用它:myBlock()
戴夫·德隆的类别比枚举对象使用block有什么好处:?@bavariage我忘了:)@Jon nope。这就是中央大调度的全部要点。它在全局线程上排队,它们在执行时执行。该选项的全部要点是将工作分散到可用的核心上。它还能做什么呢?该方法在内部使用GCD,但它会进行一些批处理以避免不必要的开销。我建议您在运行自己的程序之前先尝试一下。@Joe Blow:您可以使用任何常用的多线程解决方案,如NSOperation或GCD。例如,您可以GCD异步分派一个块,该块将-EnumerateObjectsWithoOptions:usingBlock:
发送到数组。@Joe Blow:是的,Dave的代码分派块以进行异步执行。阵列上的迭代是同步的,尽管它只会对大型阵列产生显著的影响。@Joe-如果您想进行实验,我为我的课程创建了一个简单的测试应用程序,演示Dave和(BaVariable)方法的变体:。查看MATCGCD.m文件,在该文件中,可以使用注释打开和关闭这两种方法。对于受计算限制的任务,它们实际上是相同的(在后台分派,立即返回,并行处理数组中的项)。使用此示例,您可以观察任务是如何实时执行的。
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL * stop) {
dispatch_async(dispatch_get_global_queue(0,0), ^{
[obj performSelector:@selector(doFoo)];
};
}];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[array enumerateObjectsWithOptions:NSEnumerationConcurrent
usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// do something with obj
}];
});