1

開始点と終了点をアドレス文字列にローカライズして、に格納できるようにしようとしていますNSUserDefaults。問題は、メソッドが実行を継続し、変数を設定しないことです。

NSLog(@"Begin");

__block NSString *returnAddress = @"";

[self.geoCoder reverseGeocodeLocation:self.locManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
    if(error){
        NSLog(@"%@", [error localizedDescription]);
    }

    CLPlacemark *placemark = [placemarks lastObject];

    startAddressString = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                          placemark.subThoroughfare, placemark.thoroughfare,
                          placemark.postalCode, placemark.locality,
                          placemark.administrativeArea,
                          placemark.country];
    returnAddress = startAddressString;

    //[self.view setUserInteractionEnabled:YES];
}];
NSLog(returnAddress);

NSLog(@"Einde");

これは私のアプリケーションデバッガーが示すものです:


eindeを開始します

たとえば、私の場所の住所が「Mainstreet 32​​、CITY」の場合。次に、私が見たいのは次のとおりです。


Mainstreet 32​​、
CITYEinde を開始します

問題は、コードが終了を待たないCLGeocoderため、変数returnAddressが返されたときに変数が設定されず、空であるということです。

誰かがこれを回避する方法を知っていますか?

4

1 に答える 1

6

には完了ブロックがあるためreverseGeocodeLocation、実行がそれに達すると別のスレッドに渡されますが、メインスレッドでの実行は、次の操作である。に引き続き続行されますNSLog(returnAddress)。この時点では、他のスレッドに渡されただけreturnAddressなので、まだ設定されていません。reverseGeocodeLocation

完了ブロックを操作するときは、非同期で作業することを考え始める必要があります。

reverseGeocodeLocationメソッドの最後の操作として残し、完了ブロック内の残りのロジックを使用して新しいメソッドを呼び出すことを検討してください。これにより、の値が得られるまでロジックが実行されなくなりますreturnAddress

- (void)someMethodYouCall 
{
    NSLog(@"Begin");
    __block NSString *returnAddress = @"";

    [self.geoCoder reverseGeocodeLocation:self.locManager.location completionHandler:^(NSArray *placemarks, NSError *error) {
        if(error){
            NSLog(@"%@", [error localizedDescription]);
        }

        CLPlacemark *placemark = [placemarks lastObject];

        startAddressString = [NSString stringWithFormat:@"%@ %@\n%@ %@\n%@\n%@",
                              placemark.subThoroughfare, placemark.thoroughfare,
                              placemark.postalCode, placemark.locality,
                              placemark.administrativeArea,
                              placemark.country];
        returnAddress = startAddressString;

        //[self.view setUserInteractionEnabled:YES];

        NSLog(returnAddress);
        NSLog(@"Einde");

        // call a method to execute the rest of the logic 
        [self remainderOfMethodHereUsingReturnAddress:returnAddress];
    }];
// make sure you don't perform any operations after reverseGeocodeLocation.
// this will ensure that nothing else will be executed in this thread, and that the
// sequence of operations now follows through the completion block.
}

- (void)remainderOfMethodHereUsingReturnAddress:(NSString*)returnAddress {
   // do things with returnAddress.
}

または、NSNotificationCenterを使用して、完了時に通知を送信できますreverseGeocodeLocation。これらの通知は、必要な他の場所でサブスクライブして、そこからロジックを完了することができます。置換[self remainderOfMethodHereWithReturnAddress:returnAddress];

NSDictionary *infoToBeSentInNotification = [NSDictionary dictionaryWithObject:returnAddress forKey:@"returnAddress"];

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"NameOfNotificationHere" 
    object:self
    userInfo: infoToBeSentInNotification];
    }];

NSNotificationCenterの使用例を次に示します。

于 2013-01-15T20:53:21.340 に答える