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

时间:2015-07-21 09:38:01

标签: ios xcode multithreading restart nsthread

简短的问题:您能否以某种方式使用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. 当应用程序仍在群集时,请再次缩小。
  4. 因此,您缩小以在地图上获取新区域,然后再次缩小。旧的聚类继续,并且不考虑新区域。这会导致聚类与我当前的地图区域不匹配。

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

1 个答案:

答案 0 :(得分:1)

将Vladimirs回答为正确答案:

一旦功能已经开始,可能很难。看看NSOperation - 它将允许以更清晰的方式构建您的代码并且它支持取消,同时请注意,您必须调整您的聚类功能,以便能够在中间返回,如果它被取消

我的回复:

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