2013-03-24 81 views
-2

我遇到問題。我想更改塊中的局部變量。我嘗試了一切。我把變量__block的開始,但沒有什麼改變。我不能改變塊中的myString值。你可以幫幫我嗎 ?這裏是我的代碼:在目標C中更改塊中的變量

- (IBAction)setButtonPressed:(id)sender { 
    placeName = [[[NSMutableString alloc] init] retain]; 
    __block NSMutableString *myString = [[NSMutableString alloc] init]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSDate *today = [NSDate date]; 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 

    [dateFormat setDateFormat:@"dd.MM.yyyy hh:mm:ss"]; 

    NSString *dateString = [dateFormat stringFromDate:today]; 

    [previousParkingLon addObject:[NSNumber numberWithFloat:self.longitude]]; 
    [previousParkingLat addObject:[NSNumber numberWithFloat:self.latitude]]; 
    [previousParkingsDate addObject:dateString]; 
    if((self.latitude != 0) && (self.longitude != 0)) 
    { 
     self.geocoder = [[CLGeocoder alloc] init ]; 
     [self.geocoder reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray *placemarks, NSError *error) { 
      CLPlacemark *myplacemark = [placemarks objectAtIndex:0]; 
      NSString *locatedAt = [[[myplacemark addressDictionary] objectForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; 
      [myString setString:locatedAt]; 
     }]; 
    } 
     [previousParkingsPlaceName addObject:placeName]; 
    NSLog(@"Test %@",myString); 
     [defaults setObject:previousParkingLat forKey:@"historyLat"]; 
     [defaults setObject:previousParkingLon forKey:@"historyLon"]; 
     [defaults setObject:previousParkingsDate forKey:@"historyDate"]; 
     [defaults setObject:previousParkingsPlaceName forKey:@"historyName"]; 


     [defaults synchronize]; 

} 
+0

你的問題是什麼? – 2013-03-24 01:11:48

+0

並且可以標記給您帶來麻煩的代碼行。 – 2013-03-24 01:14:03

+2

你甚至不需要'__block',因爲變量沒有被賦值爲其他值。還有問題是在執行塊之前打印'myString'的值 – 2013-03-24 01:16:39

回答

1

當你正在執行的程序塊時self.geocoder與它的動作完成後,locatedAt被附加到myString你輸出myStringNSLog(後iOS不動之前執行塊)。您會注意到,如果您將NSLog放在塊中,該值將會成功輸出。

如果要使用值myString執行操作,您有兩個選項。第一種方法是在代碼塊中包含使用myString的代碼,或者將代碼放入一個函數中並從該代碼塊中調用該函數。不要將代碼直接放在塊後面!你的第二個選擇是在使用myString的值之前檢查塊是否已經執行。創建一個具有全局作用域的布爾值,然後在該塊中將bool的值設置爲YES。然後,您可以在使用myString的值之前檢查bool是否設置爲YES。

+0

感謝您的回答,但我想在外部使用myString值。你能幫我解答嗎? – 2013-03-24 01:18:51

+0

好的,給我一下 – 2013-03-24 01:19:28

+0

真的謝謝。我正在處理這個問題4個小時,但我沒有解決它:( – 2013-03-24 01:22:25

0

關鍵是Geocoder'異步'執行完成塊''。該方法的其餘部分運行時,塊將不會運行。

p.s. __block將是多餘的無論如何因爲你沒有分配到任何地方的myString變量

+0

感謝您的幫助:) – 2013-03-24 13:38:48