2014-01-05 45 views
0

我正在使用CoreLocation來獲取用戶位置。我需要抓住用戶的位置然後發送到服務器。我有這一切工作,但!我正在實施locationManager:(CCLLocationManager *)manager...確保locationManager已完成然後執行請求

我的網址請求在找到位置之前發生。最新最好的辦法:

  • 請求位置
  • 存放在字符串
  • 發送串請求

我希望確保該位置其發送之前找到。我是否使用條件檢查類的實例,並在塊內部檢查服務器。我不需要不斷更新,只要抓住一次,stopUpdatingLocation

正想通過這個帖子之前:Getting Longitude/Latitude of the User When the viewDidLoad

我到目前爲止有:關於如何做到這一點

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; 

    [locationManager startUpdatingLocation]; 

    ...more below... server request below here 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) { 
     NSLog(@"found!"); 
     [locationManager stopUpdatingLocation]; 
    } 
} 

的思考?我認爲條件可能會起作用,但不確定是否有適當的方法來處理使用CoreLocation提供的方法。

回答

0

創建一個新的方法來執行您的位置相關的代碼。然後,一旦你有位置(即在NSLog(@「found!」);行)之後,調用此方法。

請注意,隨着位置精度的提高,該方法可能會被多次調用 - 您可能需要處理該問題。

例如:

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers; 

    [locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSLog(@"didUpdateToLocation: %@", newLocation); 
    CLLocation *currentLocation = newLocation; 

    if (currentLocation != nil) 
    { 
     NSLog(@"found!"); 
     [self handleLocation:newLocation]; 
     [locationManager stopUpdatingLocation]; 
    } 
} 

- (void)handleLocation:(CLLocation*)location 
{ 
    // handling code here 
} 
0

位置管理器是異步的。您必須要求提供位置更新,然後等待它給您回電。

更糟糕的是,前幾個更新通常是需要扔掉的垃圾。

第一個位置更新通常有一個時間戳,幾小時,幾天甚至幾周。您首先必須檢查以確保時間戳記在最後幾秒鐘內。

一旦你這樣做了,你需要檢查水平精度,並確保讀數足夠準確。通常,當您首次啓動位置管理器時,前幾個讀數的精度值超過一公里,這很糟糕。 (準確度實際上是一個半徑值,你只能確定你得到的位置是在具有指定半徑的圓內的某個位置。)你需要拿出一個「足夠好」的應用專用準確性讀數,然後拋出直到你得到一個足夠好的讀數爲止。您還需要檢查否定準確度讀數,這意味着GPS正在返回無效值。

接下來,您必須考慮GPS在合理時間內沒有安頓下來的情況。 (有時可能需要幾分鐘的時間,或者根本沒有獲得好的閱讀。)在這種情況下,您需要將其作爲失敗處理。

所以,要處理所有需要編寫locationManager:didUpdateLocation:方法來檢查時間戳和水平精度以確保讀數實際上是好的。如果在合理的等待之後無法獲得體面的位置信息,則還需要確保您超時並報告失敗。一種方法是在第一次開始位置更新時啓動一個「放棄」定時器,並在獲得良好的閱讀後殺死它。如果計時器觸發,請停止位置更新並向用戶報告「無法獲得良好的位置讀數」錯誤。瞭解,花費10或15秒才能獲得準確的讀數並不罕見。

+0

哦,很高興知道。在這個應用案例中,我顯示潮汐,因此它最近的感謝上帝的潮汐站點不需要超級準確的讀數,但是不管這些仍然是我在將數據返回給用戶之前應該考慮的事情。欣賞它。 – Coughlin

相關問題