0

Я запускаю блок для подключения всех пользователей к учетной записи Quickblox.Но после добавления имени пользователя в изменяемый массив количество массивов все еще показывает нуль или пустой массив.Невозможно добавить объект внутри блока

QBGeneralResponsePage *page = [QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:10]; 
    [QBRequest usersForPage:page successBlock:^(QBResponse *response, QBGeneralResponsePage *pageInformation, NSArray *users) { 

     for (int i =0; i<users.count; i++) { 
      QBUUser *user = [[QBUUser alloc]init]; 
      [_contacts insertObject:user.login atIndex:i]; 
     } 

    } errorBlock:^(QBResponse *response) { 

    }]; 
+1

где вы используете массив в связи с этим кодом? aka, где вы проверяете размер массива, если функция 'usersForPage' является асинхронной, если вы пытались получить доступ к массиву сразу после этого, она была бы пустой, так как обработчик завершения для метода еще не выполнен – Fonix

+0

Я использую этот код в viewDidLoad, где «_contacts» - это массив, я хочу использовать массив в методе labelTew .... Я думаю, что вы правы, функция является асинхронной. Что мне делать? –

+1

hmm, трудно сказать только из этого фрагмента, но я полагаю, что ваша таблица основывает свои ячейки на массиве '_contacts', возможно, вам просто нужно перезагрузить tableview из обработчика завершения, и он просто сработает. в противном случае вам может понадобиться сделать что-то еще, что вам нужно сделать в обработчике завершения, а не после вызова функции – Fonix

ответ

0

У меня есть ощущение, что вы пытаетесь использовать массив до обработчика завершения фактически выполняется

QBGeneralResponsePage *page = [QBGeneralResponsePage responsePageWithCurrentPage:1 perPage:10]; 
[QBRequest usersForPage:page successBlock:^(QBResponse *response, QBGeneralResponsePage *pageInformation, NSArray *users) { 

    for (int i =0; i<users.count; i++) { 
     QBUUser *user = [[QBUUser alloc]init]; 
     [_contacts insertObject:user.login atIndex:i]; 
    } 

    [self.tableview reloadData]; //possible fix 

    //move any other code that uses _contacts here, or call a function that will deal with _contacts 

} errorBlock:^(QBResponse *response) { 

}]; 

//if you are trying to use _contacts here, its size will be 0 because the above completion handler has not executed yet. 
//consider moving whatever is here into the completion handler above 
+0

Я попробовал это .. но проблема в том, что мне также нужно установить количество строк в соответствии с количеством массивов. но numberOf Метод строк вызывается до выполнения блока. –

+0

hmm, но это должно быть вызвано только из '[self.tableview reloadData];', который в этот момент будет массивом '_contacts', если у вас есть код, как я показал. вы уверены, что не перезагружаете данные где-то в другом месте или используете какой-либо другой метод tableview, который может вызвать преждевременное возникновение? – Fonix

+0

numberOfRows может быть вызван на начальном создании таблицы, независимо от того, что, вероятно, будет срабатывать преждевременно, но затем снова будет срабатывать после '[self.tableview reloadData];' из блока завершения произойдет, тогда ваша таблица должна сообщить правильное количество строк от этой функции, если она просто возвращает размер _contacts – Fonix

0

Это все о логике, я понял это, как он нажмет на мой взгляд простой однострочное решение.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"identifier"]; 
      //cellLabelText will not get filled by array until the block api gets data in array 

      if (_contacts.count>0) { 
        cell.textLabel.text = [arrContacts objectAtIndex:indexPath.row]; 
      } 

      return cell;