2015-07-21 17 views
0

簡短問題:您可以用XCode以某種方式重啓後臺進程嗎?在ios上重新啓動後臺選擇器

長的問題:

我編碼與XCode的一個應用程序,包括它的MKMapView標記的聚類算法。每次移動地圖時,簇必須更新,並且在3000個以上的位置需要大約2秒。聚類基本上由所有位置上的for-loop組成,並且只聚類並繪製當前區域可見的位置,計算位置和縮放。由於需要一些時間,我已經將聚類算法作爲後臺進程啓動。

[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. 縮小時,aplication已經工作了一段聚類
  3. 當應用程序仍在集羣,放大再次出來。

因此,您可以縮小以在地圖上獲取新區域,然後再次縮小。舊的聚類仍在繼續,新的區域未被考慮在內。這會導致與我當前的地圖區域不匹配的羣集。

我希望它在每次移動地圖時都重新啓動集羣,併爲新地區執行此操作,爲此我必須中斷舊集羣並啓動新集羣。這可能嗎?

+1

一旦功能已經開始,可能會很困難。看看NSOperation - 它將允許以更清晰的方式構建代碼並支持取消,同時請注意,如果它被取消,您必須調整集羣函數以便能夠在中間返回 – Vladimir

+0

聽起來有趣,我會研究它。謝謝! – Rkey

+0

NSOperation正是我所期待的。在for循環中,我可以檢查每個循環是否已取消操作,並且可以輕鬆開始新的操作。非常感謝! – Rkey

回答

1

發佈Vladimirs答案正確答案:

一旦功能已啓動,可能很難。看看NSOperation - 它將允許以更清晰的方式構建你的代碼,並支持取消,同時請注意,如果它被取消,你將不得不調整你的集羣功能以便能夠在中間返回。

我的回覆:

NSOperation正是我一直在尋找的。在for循環中,我可以檢查每個循環是否已取消操作,並且可以輕鬆開始新的操作。非常感謝!

相關問題