2014-09-27 2 views
0

Я пытаюсь получить некоторые данные из удаленного файла. Я создаю массив _items внутри блока асинхронного запроса, который на самом деле заполнен данными, но при вызове _items где-либо еще в моем контроллере все еще пусто.Как использовать асинхронные данные

Я не уверен, но я предполагаю, что, поскольку данные загружаются асинхронно, при вызове _items все еще пусто. Итак, как я могу использовать массив с данными после завершения async-задачи?

- (IBAction)fetchEvent 
{ 

    _items = [[NSMutableArray alloc] initWithCapacity:5]; 
    NSString *link = [NSString stringWithFormat:@"url...?id=%@", self.eId]; 
    NSURL *url = [NSURL URLWithString:link]; 
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, 
              NSData *data, NSError *connectionError) 
    { 
     if (data.length > 0 && connectionError == nil) 
     { 
      NSDictionary *match = [NSJSONSerialization JSONObjectWithData:data 
                   options:0 
                   error:NULL]; 
      NSArray *odds = [match objectForKey:@"odds"]; 
      OddsItem *item; 

      for (NSDictionary *books in odds) { 
       item = [[OddsItem alloc] init]; 
       item.oddsBook = [odds objectForKey:@"book"]; 
       [_items addObject:item];     
      } 
     } 
    }]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self fetchEvent]; 
} 
+0

можно было бы, чтобы ваш блок завершения опубликовать уведомление, когда загрузка данных завершена, и ваш контроллер представления реагировать на это уведомление, делая все, что вам нужно сделать с '_items'. Вы также можете передать блок 'fetchEvent', который он мог бы выполнить в конце обработчика завершения. –

ответ

0

изменчивые данные опасны в многопоточной ситуации. NSArray лучше.

@property (nonatomic, copy) NSArray *items; 

блок может захватывать внешние переменные, но не может изменять его напрямую. В блоке завершения попробовать это

if (data.length > 0 && connectionError == nil) 
    { 
     NSDictionary *match = [NSJSONSerialization JSONObjectWithData:data 
                  options:0 
                  error:NULL]; 
     NSArray *odds = [match objectForKey:@"odds"]; 
     NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:5]; 
     for (NSDictionary *books in odds) { 
      OddsItem *item = [[OddsItem alloc] init]; 
      item.oddsBook = [odds objectForKey:@"book"]; 
      [items addObject:item];     
     } 
     self.items = items; 
    } 
+0

Я использовал '__block', но я получаю несколько предупреждений и ошибок ...' Указатель типа отсутствует, по умолчанию 'int'' 'Несовместимый указатель на целочисленное преобразование инициализации' int 'с выражением типа' NSMutableArray * '' и т. д. – mynameis

+0

@ user3279339 ok Я не знаю, что такое тип '_items'. '__block NSMutableArray * items = [[NSMutableArray alloc] initWithCapacity: 5];' in block '[items addObject: item]' должен работать – dopcn

+0

'NSMutableArray * _items;' – mynameis

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