2014-11-25 15 views
0

У меня есть массив, называемый «местами», который я генерирую следующим способом. Я пытаюсь использовать его другим способом, но каждый раз, когда я пытаюсь получить доступ к нему другим способом, массив имеет значение «null». Этот метод:не может ссылаться на массив вне блока

- (void)startSearchWithString:(NSString *)string { 
    [self.lastSearchOperation cancel]; 
    self.lastSearchOperation = [Foursquare2 
     venueSearchNearLocation:@"Chicago" query:nil limit:nil intent:intentCheckin radius:nil categoryId:string 
      callback:^(BOOL success, id result){ 
      if (success) { 

       NSDictionary *dic = result; 
       NSArray *venuesDic = [dic valueForKeyPath:@"response.venues"]; 
       self.venues = [SearchVenue placesWithArray:venuesDic]; 
       NSLog(@"self.venues inside is %@",self.venues); 
      } else { 
       NSLog(@"%@",result); 
      } 
     }]; 
    NSLog(@"self.venues outside is %@",self.venues); 
} 

self.venues внутри содержание журналов. self.venues наружный журналы (null). Я пытаюсь __блокировать, но безуспешно.

В моей .h у меня есть:

@property (strong, nonatomic) NSArray *venues; 
+0

Вы уверены, что получаете доступ к массиву после завершения блока обратного вызова? – dogsgod

+0

Когда log self.venues внутри содержимого, но self.venues снаружи - «null». Я расследую __block, но не могу его зарегистрировать. – Ryasoh

+1

Поиск, который вы выполняете, является асинхронным. Вы увидите, что «внешние» журналы ДО «внутри». – Fogmeister

ответ

0

Блок обратного вызова выполняется асинхронно после завершения venueSearchNearLocation.

код журнала:

NSLog(@"self.venues outside is %@",self.venues); 

вероятно запускается на выполнение до вашего обратного вызова блока и, следовательно, self.venues по-прежнему равна нулю.

Вы должны получить доступ к self.venues после того, как завершит ваш callback-блок.

Как вы это действительно зависите от своего приложения. Один из способов потери связи - опубликовать уведомление после того, как вы установили свой массив.

[[NSNotificationCenter defaultCenter] postNotificationName: 
             @"VENUES_RECEIVED " object:nil]; 

и в некотором инициализаторе, вы должны слушать это уведомление:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(receivedVenus) 
             name:@"VENUES_RECEIVED" object:nil]; 

и, конечно, вам нужен метод, где вы можете работать с массивом

- (void) receivedVenus 
{ 
    NSLog(@"self.venues outside is %@",self.venues); 
} 

Не забыть удалить своего наблюдателя (т.е. в dealloc)

[[NSNotificationCenter defaultCenter] removeObserver:self]; 
+0

Вам даже не нужен nsnotificationceter. Просто вызовите полученный метод. – Fogmeister

+1

Откуда?внутри блока (например, после «NSLog (@« self.venues inside is% @ », self.venues); ')? – Ryasoh

+0

postNotificationName из блока после установки вашей переменной – theguy

-1

Попробуйте

NSArray *venuesDic = [NSArray arrayWithArray:[dic valueForKeyPath:@"response.venues"]]; 
+0

Я могу получить данные для self.venues, но проблема связана с ним вне этого метода. Я изменю вопрос. – Ryasoh

+0

SearchVenue возвращает NSArray? –

+0

Если это «ноль», похоже, что вы его не инициализировали. 'self.venues = [NSArray arrayWithArray: [SearchVenue placesWithArray: venuesDic]];' –

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