在 ios 上重新启动背景选择器

Restarting background selectors on ios

小问题:你能用XCode重启后台进程吗?

长问题:

我正在使用 XCode 编写一个应用程序,其中包括针对其 MKMapView 上的标记的聚类算法。每次移动地图时,集群都必须更新,对于 3000 多个位置,这大约需要 2 秒。聚类基本上由所有位置的 for 循环组成,并且仅聚类并绘制我当前区域可见的位置,同时计算位置和缩放。由于需要一些时间,我已将聚类算法作为启动它的后台进程。

[self performSelectorInBackground:@selector(clusterizeAndStopSpinnerWhenDone) withObject:nil];

由于您现在可以在执行后台聚类时与地图进行交互,因此在应用程序将导致两个线程进入相同的 for 循环时再次移动地图:

"Terminating app due to uncaught exception 'NSGenericException', reason: '***   Collection <__NSArrayM: 0x17cc5060> was mutated while being enumerated.'"

这是通过 simlpy 修复的,它有一个布尔值告诉应用程序集群是否已经 运行。

这个新设置有效,但有一件事困扰着我。它出现在以下一组操作中:

  1. 启动应用程序,地图上出现初始集群
  2. 缩小,应用程序必须在集群中工作
  3. 在应用程序仍在集群的同时,再次缩小。

因此您缩小地图以在地图上获得一个新区域,然后再次缩小。旧的聚类继续,新的区域不被考虑。这导致聚类与我当前的地图区域不匹配。

我希望它在每次移动地图时重新启动聚类并为新区域执行此操作,为此我将不得不中断旧的聚类并开始新的聚类。这可能吗?

张贴 Vladimirs 的答案作为正确答案:

一旦功能已经启动,可能会比较困难。看看 NSOperation - 它允许以更清晰的方式构建你的代码并且它支持取消,还要注意你必须调整你的聚类功能才能在中间 return 如果它是已取消

我的回复:

NSOperation 正是我想要的。在 for 循环中,我可以检查每个循环是否取消了操作,并且可以轻松地开始新操作。非常感谢!