2010-11-16 96 views
0

我在CLLocationManager回調中遇到了一些問題
等待異步回調的最佳方式是什麼?等待異步回調 - Objective-C

這裏是我基本上要做到:

 

- (NSString *)getCurrentCity 
{ 
     [self.locationManager startUpdatingLocation]; 
     // Wait for coordonate in callbacks 
     self.geocoder = [MKReverseGeocoder alloc] initWithCoordonate:self.newCoordonate]; 
     [self.geocoder start]; 
     // Wait for information with MKReverse callbacks 
     return self.currentCity; 
} 
// Callbacks methods of MKReverseGeocoder and CLLocationManager 
- (void)locationManager:(CLLocationManager *)manager 
    idUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
     CLLocationCoordinate2D newCoordonate = newLocation.coordinate; 
     self.currentCoordonate = &newCoordonate; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder 
     didFindPlacemark:(MKPlacemark *)placemark 
{ 
     self.currentCity = placemark.locality; 
} 

凡self.currentCity和self.newCoordonate是我CLASSE的attribut。

我嘗試了一些技巧,如線程和/或同步,但我沒有管理它在所有完成之前不返回。

問候

+0

self.currentCoordonate =&newCoordonate;這讓我害怕了很多級別 – 2010-11-16 16:26:25

+0

異步回調的重點在於您無需等待。 – koo 2010-11-16 17:18:17

回答

2

你不要等待它完成,你處理的更新時異步locationmanager:didUpdatefromLocation:被調用。這就是異步編程的要點。 :)

+0

我同意;事實上 。我想調用一個方法來通過異步回調傳遞一個信息。如果我能通過它同步,我會對我很好,我認爲 – klefevre 2010-11-16 16:34:10

+0

一種方法可能是編寫一個包裝類'GPSManager'或類似的東西。它將處理'CLLocationManager'的東西,並公開兩個屬性,如'positionAvailable'和'currentPosition',以用於其他代碼。 – 2010-11-16 16:40:03

+0

我已經試過,但它的相同點...如何知道我的財產是否已經改變?它也是異步工作的。 – klefevre 2010-11-16 16:44:47

1

無論何時您阻止主線程,您的應用程序都會變得無響應(最好),並且會被系統拋棄(即在最壞的情況下被殺)。

對於異步API,最簡單的模式是隔離線程或排隊的全部或用於使主線程工作的任何機制轉換爲根據需要將rendezvousing轉換回主線程的類。

舉一個例子,看看NSFileHandle。它有一個readInBackgroundAndNotify:方法。在使用時,NSFileHandle實例會在內部創建一個線程,使用該線程讀取所需的任何內容,然後使用類似performSelectorOnThread:的內容將通知發送到線程 - 通常是主線程 - 首先調用readInBackgroundAndNotify:

通過這樣做,該類的用戶不必處理線程,但該類不會阻止主事件循環。


BTW:

{ 
    CLLocationCoordinate2D newCoordinate = newLocation.coordinate; 
    self.currentCoordonate = &newCoordinate; 
} 

這是完全錯誤的,肯定火的方式來保證崩潰或不確定的行爲。 &newCoordinate給出了地址newCoordinate,但該結構在堆棧中。只要該方法返回,該結構的內容即將被丟棄。

+0

我這樣做是因爲我聲明瞭CLLocationCoordinate2D的指針。所以CLLocationCoordinate2D * newCoordinate =&newCoordinate;完美工作 – klefevre 2010-11-16 17:03:10

+1

@ KL94:是的,這是一個指針,當然,您的代碼已被Objective-C的類型系統接受。除了確保你的類型匹配之外,還有更多工作程序。將指針指向一個自動變量並將其存儲在一個實例變量中是未定義的行爲 - 這是一個等待發生的錯誤或崩潰。問自己要找到正確的解決方案:*爲什麼*是那個實例變量的一個指針?如果有理由需要,那是什麼原因?你需要圍繞這個約束設計你的代碼。否則,不要讓它成爲指針。 – Chuck 2010-11-16 17:58:19