2

我有一种方法可以用不同的数据重复执行数学运算(可能是数百万次)。在 iOs 中执行此操作的最佳方法是什么(它将在 iPad 设备上运行)?我知道那performSelectorOnBackgroundThread已被弃用...?我还需要将所有结果汇总到一个NSArray. 最好的方法似乎是:向通知中心发布通知并将该方法添加为观察者。这个对吗?我相信该数组需要被声明为原子的......另外,我需要在操作完成时显示一个进度条......我可以并行启动多少线程?我不认为在 iDevice 上启动 1.000.000 个线程是一个好主意。

提前致谢...

4

2 回答 2

4

查看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 有许多其他调度任务的方式,其中一种直接取自上面列出的 Wikipedia 文章:

dispatch_apply(count, dispatch_get_global_queue(0, 0), ^(size_t i){
     results[i] = do_work(data, i);
    });
total = summarize(results, count);

这个特定的代码示例可能正是您正在寻找的,假设您的这个“大任务”是一个令人尴尬的并行.

于 2013-01-09T16:19:18.967 回答
3

虽然您可以同时使用dispatch_apply()和拆分所有运行,但最终会变慢。

您将希望能够同时限制运行中的运行次数,而同时计算的次数是您需要调整的东西。

我经常使用 adispatch_semaphore_t来轻松调整飞行中计算的数量。

这样做的详细信息在此处的答案中:https ://stackoverflow.com/a/4535110/25646

于 2013-01-09T17:29:46.113 回答