2011-01-13 72 views
0

我在iPhone上遇到位置奇怪的問題。它看起來很瘋狂,但似乎是可重複的。在我的應用程序中,我使用Core Location來獲取某些用戶操作的位置數據。通常它似乎工作。但是,在應用程序部署在沒有以前版本的設備上(從XCode或通過iTunes無關緊要)之後的第一次運行中,它根本不起作用。 無論
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
也不
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
被調用。我甚至沒有獲得手機信號塔的座標。 GPS彈出的唯一標誌是要求允許訪問位置數據。如果我退出應用程序(並退出,我的意思是真正殺死它,而不是僅僅投入後臺),在下一次運行時,一切都會開始正常工作。iPhone位置數據在第一次啓動時不起作用

一些更多的細節。 正如我需要在那裏用戶執行某些動作的位置,我用以下方法:

  • 我使用相同的共享CLLocationManager對象(kCLLocationAccuracyBest)和相同的共享委託對象。
  • 當用戶執行操作時,我打電話startUpdatingLocation並創建一個後臺線程,基本上是定時器,但還有更多不相關的東西。它每15秒醒來一次
  • 我累積的修復程序由- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
  • 當後臺線程喚醒時,它檢查修復和時間。如果有足夠的修復,它會停止等待。如果超過1分鐘的時間間隔,它也會停止等待。
  • 「停止等待」=調用某種方法。該方法尋求收到(如果有的話)之間的最佳解決方案並對其進行處理。它也叫stopUpdatingLocation

我沒有看到任何明顯的缺陷。而且,同樣的二進制文件通常在第二次啓動時開始工作。任何想法爲什麼?我瘋了嗎?

+0

當您第二次啓動應用程序時,是否還有彈出窗口? 如果沒有,那麼在您的代碼中可能會出現某種競爭條件,並由此彈出窗口觸發。 – 2011-01-13 14:54:29

回答

2

看來我自己找到了答案。我的應用程序需要一些啓動準備。不同的是,在第一次運行時,我做了一些大的一次性工作(通過網絡進行一些大的同步)。這個長時間的任務在後臺線程中完成。然後相同的線程進行「通用初始化」,包括創建CLLocationManager對象。當然,後臺線程很快就會離開CLLocationManager而沒有任何RunLoop。在第二次啓動時,不需要大的同步,並且在UI線程上執行「公共初始化」。因此,CLLocationManager正在主RunLoop上運行,並愉快地提供修復。總結一下:當你創建CLLocationManager對象時,在正確的線程上(或者更確切地說NSRunLoop/CFRunLoop)執行它是非常重要的。

相關問題