2013-10-06 54 views
0

我非常新的iOS開發,請與我裸露=]地理編碼和設置全局變量的iOS

我有兩個全局的NSString變量稱爲myLocality和myCountry ...

我已經設置了地理編碼爲如下:

- (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的全局變量?

+0

你在哪裏試圖打印出它們的值? doWork方法?我會嘗試通過這兩種方法來看看發生了什麼。 – canhazbits

回答

0

好的,我發現我的問題。事實證明,我過早地訪問變量。我只是將do while循環的條件更改爲myCountry == null,它的工作=]。謝謝您的幫助。

1

這些變量在哪裏聲明?

如果您在執行地理編碼的課程中使myLocalitymyCountry爲靜態,則其他類可以在設置後訪問它們。

另一種方法是創建一個@protocol並讓該地理編碼的結果在完成後接收回調。

+0

那麼,我已經在我的'.m'文件的@interface部分聲明瞭變量。在我調用GeoCode之前,我調用了locationManager,我已經把GeoCode代碼放在' - (void)locationManager中:(CLLocationManager *)manager didUpdateToLocation :(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {'這個void方法與GeoCode和變量都在同一個文件中。我試圖在同一個'.m'文件中訪問'myLocality'和'myCountry'。如果這有道理? – user959631

+1

所以也許你太早訪問它們了?你能發佈完整的代碼片段嗎? – canhazbits

+0

嗯,我不這麼認爲,我在後臺線程中擁有所有東西。除了'[locationManager startUpdatingLocation];'然後觸發上述void方法,然後調用GeoCode部分。但是我有一個'do loop''等待,直到GeoCoder完成工作。 PS:我會更新我原來的帖子... – user959631

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; 

您也可以創建一個專用的單例類並使用它來代替使用應用程序委託。

+0

好的,但是,你能解釋爲什麼我的代碼不起作用嗎? – user959631