我有一种方法可以使用不同的数据重复执行数学运算(可能数百万次)。在iOs中执行此操作的最佳方式是什么(它将在iPad设备上运行)?我知道performSelectorOnBackgroundThread
已弃用......?我还需要在NSArray
中汇总所有结果。最好的方法似乎是:向通知中心发布通知并将方法添加为观察者。它是否正确?数组需要声明为原子,我相信...另外,我需要在操作完成时显示进度条...我可以并行启动多少个?我不认为在iDevice上启动1.000.000个线程是个好主意..
提前致谢...
答案 0 :(得分:3)
查看Grand Central Dispatch,这是在iOS(和Mac)上进行多线程处理的首选方式。
使用GCD的一个简单示例如下:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
//do long running task here
}
这将执行主线程异步的块。 GCD有许多其他调度任务的方式,一个直接来自上面列出的维基百科文章:
dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
results[i] = do_work(data, i);
});
total = summarize(results, count);
这个特定的代码示例可能正是您正在寻找的,假设您的“大任务”是embarrassingly parallel。
答案 1 :(得分:2)
虽然您可以使用dispatch_apply()
并同时分拆所有运行,但最终会变慢。
您希望能够同时限制飞行中的#次运行,同时计算的数量是您需要调整的。
我经常使用dispatch_semaphore_t
来轻松调整正在进行的计算。
这样做的详细信息在这里答案:https://stackoverflow.com/a/4535110/25646