0

ユーザーの状態を単純に返そうとしています。reverseGeocodeLocation を使用する必要があることを理解しています。以下のユーザーの緯度を返すのと同じ方法で、状態を NSString として返したいと思います。

- (NSString *)getUserLatitude
{
NSString *userLatitude = [NSString stringWithFormat:@"%f", 
locationManager.location.coordinate.latitude];
return userLatitude;
}

現在、このコードを持っていますが、動作させることができません。(void)を使っているからかもしれません。私は少し迷っています。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation 
*)newLocation fromLocation:(CLLocation *)oldLocation {

CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, 
NSError *error) {
    for (CLPlacemark * placemark in placemarks) {
        NSString *userState = [placemark locality];

    return userState;

    }
}];
}

誰にもアイデアはありますか?ありがとうございました!

4

2 に答える 2

0

おそらく、completionHandler の動作方法を理解していないでしょう。はreverseGeocodeLocation:completionHandler:、ルックアップが完了したときに実行される関数であるハンドラーを受け取り、パラメーターとしてplacemarksandを使用して呼び出さerrorれます。

あなたがしなければならないことは、そのブロックで何か意味のあることを実行することです。エラーが発生したかどうかの確認を開始し、次のように失敗または成功のメソッドを呼び出します

[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
    if (error != nil) {
        // Something bad happened...
        [self didFailRetrievingUserState:error];
    } else {
        // Check whether the placemark retrieved is unique
        if (placemarks.count > 1) {
           NSMutableArray * states = [NSMutableArray array];
           for (CLPlacemark * placemark in placemarks) {
               NSString * userState = [placemark locality];
               [states addObject:userState];
           }
           [self didFinishRetrievingUserStates:states];
        } else {
           [self didFinishRetrievingUserState:[placemarks[0] locality]];
        }
    }
}];

それからもちろん、上記のブロックで呼び出している 3 つのメソッドを実装する必要があります。

- (void)didFailRetrievingUserState:(NSError *)error {
  // Show error
}

- (void)didFinishRetrievingUserStates:(NSArray *)userStates {
  // Do something reasonable with the multiple possible values 
}

- (void)didFinishRetrievingUserState:(NSString *)userState {
  // Do something reasonable with the only result you have
}

明らかに、上記のコードは提案として意図されています。たとえば、ハンドラー ブロック内のすべてのロジックを処理したり、一意のケースと一意でないケースを区別しないなど、さまざまな決定を行うことができます。

一般に、ハンドラー ブロックは関数であるため、何も返さないことを理解することが重要ですvoid。何かを行うことになっているだけで、この何かが例で定義されている「デリゲート」メソッドを呼び出している可能性があります。

于 2012-12-17T08:32:44.827 に答える
0

完了ブロックで取得した局所性を使用して何かを行う必要があります。このコードは、(void リターンを使用して) メソッドが自身を返した後、非同期で実行されます。

通常、取得した情報を渡す独自のビュー コントローラーまたはモデル クラスで何らかのメソッドを呼び出します。

を置き換えreturn userStateます。ブロックの戻り値の型と一致しません。

代わりに次のようなものを入れてください:

[myViewController didFinishGettingState:userState];

この非同期性がどのように機能するかを理解できるように、ブロックと GCD の基本を調べる必要があります。

于 2012-12-17T07:11:21.157 に答える