0

myLocality と myCountry という 2 つのグローバル NSString 変数があります...

以下のように GeoCode を設定しました。

    - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    finishedGettingLocation = false;
    if (newLocation.horizontalAccuracy < 200.0f){
        [locationManager stopUpdatingLocation];
        CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
        __block NSString *locality;
        __block NSString *country;
        [geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
            for (CLPlacemark * placemark in placemarks) {
                locality = placemark.locality;
                country = placemark.ISOcountryCode;
            }
        }];
        do {

        } while ([geoCoder isGeocoding]);

        myLocality = locality;
        myCountry = country;

        finishedGettingLocation = true;        
    }    
}

そして、私の背景スレッドは次のとおりです。

- (void) doWork
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{                   

        finishedGettingLocation = false;

        dispatch_async(dispatch_get_main_queue(), ^{
            locationManager = [[CLLocationManager alloc] init];
            [locationManager setDelegate:self];

            [locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
            [locationManager startUpdatingLocation];
        });

        int counter = 0;
        do {
            [NSThread sleepForTimeInterval:.1];
            counter ++;
            if (counter % 200 == 0){
                dispatch_async(dispatch_get_main_queue(), ^{
                    Toast *oToast = [Toast toastWithMessage:@"Gps pin-pointing works faster if you are outside"];
                    [oToast showOnView:self.view];
                });
                counter = 0;
            }

        } while (!finishedGettingLocation);

      NSLog(@"%@", myCountry); // this is where I am trying to print
      NSLog(@"%@", myLocality); // this is where I am trying to print

    });
}

(ええ、私はそれがかなりずさんなコードであることを知っていますが、まあ.. xD)

今、私が理解できないのは、他の場所のコードにログを記録すると、これらが null を返す理由です。ただし、上記にログを入れるとfor、つまりNSLog(@"%@", placemark.locality)、正しい値が得られるか、少なくとも値が得られます。

からグローバル変数を設定するにはどうすればよいplacemarkですか?

4

3 に答える 3

1

AppDelegate で地域と国のプロパティを作成し、いつでもどこでもアクセスできます。

// Set values
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

appDelegate.locality = @"Some Area";
appDelegate.country = @"Some Country";


// Get values
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

NSString *myLocality = appDelegate.locality;
NSString *myCountry = appDelegate.country;

アプリ デリゲートを使用する代わりに、専用のシングルトン クラスを作成して使用することもできます。

于 2013-10-07T01:45:17.937 に答える
1

これらの変数はどこで宣言されていますか?

ジオコーディングを行っているクラスでmakemyLocalityおよびmyCountrystatic を使用すると、他のクラスが設定されるとそれらにアクセスできます。

それを行う別の方法は、 を作成し@protocol、ジオコーディングの結果が完了したらコールバックを受け取るようにするクラスを持つことです。

于 2013-10-06T23:52:07.760 に答える
0

OK、問題が見つかりました。結局のところ、変数にアクセスするのが早すぎました。do whileループの条件を変更しただけで、 myCountry == null=] が機能しました。助けてくれてありがとう。

于 2013-10-07T15:53:44.860 に答える