2013-09-15 3 views
0

По какой-то причине я получаю почтовый индекс, когда я заношу его в скобки, но я получаю (null), когда пытаюсь войти вне скобок. Я также объявил «zip» внутри моего заголовочного файла. Я уверен, что это не проблема. Небольшая помощь?Проблемы с регистрацией за пределами текущего метода

locationManager = [[CLLocationManager alloc] init]; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    [locationManager startUpdatingLocation]; 

    CLGeocoder *fgeo = [[CLGeocoder alloc] init]; 
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray  *placemarks, NSError *error) { 
     if (!error) { 
      CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
      self.zip = placemark.postalCode; 
      **NSLog(@"%@", _zip);** 
     } 
     }]; 
    **NSLog(@"%@",self.zip);** 

ПРОБЛЕМА решаемые EDIT:

Хорошо после того, как я смог передать блок в мой следующий метод, благодаря SIMON:

CLGeocoder *fgeo = [[CLGeocoder alloc] init]; 
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray  *placemarks, NSError *error) { 
     if (!error) { 
      CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
      self.zip = placemark.postalCode; 
      **NSLog(@"%@", _zip);** 
[self someMethod]; 

я обнаружил, что в конечном итоге вызывая тот же блок вновь и вновь. Так что я был в состоянии использовать следующий код, чтобы остановить свой код от зацикливания и врезаться моим приложение, я обернул свой блок в следующем:

static dispatch_once_t once; 

и завернутую мой код в этом:

dispatch_once(&once,^{ 

}); 

Это Исправлена ​​проблема! Всем спасибо!

ответ

0

Код внутри скобок (completionHandler ака обратного вызова) будет выполняться асинхронно.

вы можете разделить на два разных метода.

- (void)someMethodYouCall { 
    locationManager = [[CLLocationManager alloc] init]; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    [locationManager startUpdatingLocation]; 

    CLGeocoder *fgeo = [[CLGeocoder alloc] init]; 
    [fgeo reverseGeocodeLocation:locationManager.location completionHandler:^(NSArray  *placemarks, NSError *error) { 
    if (!error) { 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     self.zip = placemark.postalCode; 
     **NSLog(@"%@", _zip);** 
     [self secondPart]; 
    } 
    }]; 
} 

-(void) secondPart { 
    **NSLog(@"%@",self.zip);** 
} 
+0

Хорошо, так что я понимаю, что должен быть какой-то селектор, который был объявлен где-то там? Я продолжаю получать ошибку на этой строке с помощью «secondPart». – Lalalalalala

+0

Что такое сообщение об ошибке? – Simon

+0

Итак, я сделал то, что сделал неправильно ... Я понимаю сейчас; однако теперь моя проблема в том, что почтовый индекс выходит на консоль около 50 раз. В любом случае, чтобы остановить это? – Lalalalalala

0

Обработчик завершения, который вы используете, является асинхронным.

reverseGocodeLocation:completionHandler: будет вызывать блок, который вы определяете, когда это делается с его вычислением (когда это возможно).

До тех пор ничего определенного там не будет.

После того, как блок отправлен, следующая строка кода (внешняя NSLog) работает как обычно.

Таким образом работает до обработчик завершения, а до self.zip имеет значение.

+0

Хорошо, это имеет смысл. Как я могу собрать это значение, чтобы использовать его за пределами блока? – Lalalalalala

+0

@JulioLopez - вы можете получить к нему доступ в соответствии с нормальным (с 'self.zip'), но только * после *, который был запущен блоком.Вы можете достичь этого, например, путем вызова метода делегата в блоке или путем публикации нового блока для GCD. – sapi

+0

Извините, но это совершенно новое для меня, вы думаете, что можете показать мне или указать мне в направлении ссылки на работу? Я попытался использовать self.zip, и он все равно вышел как «null». – Lalalalalala

0

Это потому, что вы получаете zip внутри блока. Он называется чуть позже кода сразу после него. Поэтому, если вы попытаетесь получить доступ к zip за пределами этих скобок, ваш zip еще не инициализирован. Вам нужно познакомиться с тем, как работают блоки. Вот хороший учебник, чтобы начать с: Blocks tutorial

Также смотрите на официальной документации Apple official documentation

+0

Помогла ли это директива __block (двойное подчеркивание)? – DogCoffee

+0

@Smick no, it woudn't –

0

@Andrey, спасибо за информацию. Я хотел поделиться этим, я нашел, может помочь кому-то по треку.

http://www.informit.com/blogs/blog.aspx?uk=Ask-Big-Nerd-Ranch-Blocks-in-Objective-C

There is one wrinkle to using variables external to the block, however: by default they are considered const and cannot be modified (static and global variables are an exception to this). As such the following code produces a compiler error:

int matching = 0; 
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
if (/* condition */) 
    matching++; // Error since matching is const within the block! 
}]; 

By adding the __block storage type modifier we can make this code snippet work:

__block int matching = 0; 
[objects enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
if (/* condition */) 
    matching++; // Can modify matching due to __block modifier. 
}]; 
+0

Я пробовал другой подход, но это тоже работает! Проверьте мое редактирование! Благодаря! – Lalalalalala

+0

Радость моя работала, ваш метод - хорошая работа. Все сводится к тому, что имеет для вас больше смысла. ура – DogCoffee

Смежные вопросы