2016-07-05 3 views
0

Я реализовал UITableview в ViewController. Я хочу отобразить некоторые данные в TableView, который извлекается через JSON.TableView Array возвращает null

- (void)getData 
{ 

    NSURLSession*session=[NSURLSession sharedSession]; 

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
    NSLog(@"%@", json); 

    NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"]; 


    for (NSDictionary*appDict in entryarr) { 
     NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"]; 


     NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"]; 
     NSURL*imageURL=[NSURL URLWithString:imageStr]; 

     NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; 
     [self.imageArray addObject:imageData]; 
     [self.tittleArray addObject:title]; 
     [self.termArray addObject:title]; 

    } 

    NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count); 

}]; 
[dataTask resume]; 

} 

Теперь, когда я назначаю Array ячейке TableView, он дает Array Empty. Но в методе getData массив состоит из 10 элементов.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return _tittleArray.count; 


} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSString*[email protected]"use"; 
    UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:reUse]; 

    if (cell==nil) { 
     cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reUse]; 
     cell.textLabel.textColor = [UIColor orangeColor]; 


    } 
    cell.textLabel.text=[self.tittleArray objectAtIndex:indexPath.row]; 

    cell.imageView.image=[self.imageArray objectAtIndex:indexPath.row]; 

    return cell; 

} 

Почему это так.? Как мне это сделать.? Может ли кто-нибудь предоставить мне правильные решения?

+1

reloadData отсутствует ... .reload your tableview –

+0

Вместо трех отдельных массивов используется один массив и пользовательский класс, содержащий три свойства в качестве модели данных. Это объектно-ориентированное программирование. – vadian

+0

Оформить заказ на указанный ответ. –

ответ

1

Ну, в то время как все другие ответы предлагая добавить

[self.tableView reloadData]; 

могли бы решить эту проблему, если ваш блок бегал в основном потоке, но так как вы делаете операцию сети, которая идет в другой поток, вы выиграли Невозможно изменить интерфейс из этого потока. Вы можете сделать это вместо:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
}); 

Прежде всего, это фундаментальная проблема, где вы даже не вызвав функцию перезагрузки. Другая проблема заключалась в основном понимании того, как все работает. Поэтому всякий раз, когда ваша модель готова и заполнена, но ваш пользовательский интерфейс не изменяется (если вы вызываете функцию изменения пользовательского интерфейса), попробуйте просмотреть выход журнала, иногда он говорит, что вы не можете изменить интерфейс в другом потоке, а также проверить, какой поток, на котором работает код.

0

Обновить таблицу внутри блока

NSURLSession*session=[NSURLSession sharedSession]; 

    NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
     NSLog(@"%@", json); 

     NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"]; 


     for (NSDictionary*appDict in entryarr) { 
      NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"]; 


      NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"]; 
      NSURL*imageURL=[NSURL URLWithString:imageStr]; 

      NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; 
      [self.imageArray addObject:imageData]; 
      [self.tittleArray addObject:title]; 
      [self.termArray addObject:title]; 

     } 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView Reloaddata]; 
}); 

     NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count); 
    }]; [dataTask resume]; 

    } 
+0

Я тоже попробовал .. Но не работает – remyr3my

+0

используйте этот отредактированный код сейчас с диспетчером – PinkeshGjr

0

Просто перезагрузите tableView из обработчика завершения работы dataTaskWithURL.

И дождитесь завершения вызова веб-службы, потому что это асинхронный вызов, поэтому ваш reloaddata tableview получит звонок через несколько раз. Это может занять много времени, если данные больше или интернет-соединение идет медленно.

Вы можете поместить контрольные точки в обработчик завершения, чтобы проверить, когда он вызван.

Вы также можете отображать индикатор активности.

Во-вторых, убедитесь, что ваше название, imageStr или imageData не равно нулю или null. Потому что вы просто печатаете счетчик массива. Если вы добавите пустой объект в массив, то он увеличит количество, но фактическое значение будет пустым.

Итак, правильно управляйте всем, и вы поймете, что когда вы совершаете ошибку.

0

вызова перезарядка данных, если массив рассчитывать больше 0 смотри ниже код для справки

- (пустоты) GetData {

NSURLSession * сессия = [NSURLSession sharedSession];

NSURLSessionDataTask * dataTask = [сессия dataTaskWithURL: [NSURL URLWithString: @ "https://itunes.apple.com/us/rss/topaudiobooks/limit=10/json"] completionHandler:^(NSData * данные, NSURLResponse * отклика, NSError об ошибке *) {

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 
NSLog(@"%@", json); 

NSArray*entryarr=[[json objectForKey:@"feed"]objectForKey:@"entry"]; 


for (NSDictionary*appDict in entryarr) { 
    NSString*title=[[appDict objectForKey:@"im:name"]objectForKey:@"label"]; 


    NSString*imageStr=[[[appDict objectForKey:@"im:image"]objectAtIndex:2]objectForKey:@"label"]; 
    NSURL*imageURL=[NSURL URLWithString:imageStr]; 

    NSData*imageData=[[NSData alloc]initWithContentsOfURL:imageURL]; 
    [self.imageArray addObject:imageData]; 
    [self.tittleArray addObject:title]; 
    [self.termArray addObject:title]; 

} 


NSLog(@"%lu %lu %lu",(unsigned long)self.imageArray.count,(unsigned long)self.tittleArray.count,(unsigned long)self.termArray.count); 

}]; 
[dataTask resume]; 

// add reload data 
if([self.termArray count] >0) 
// call reload data here 
} 
0

Просто напишите, как, Alloc и объект init вашего объекта массива перед вызовом API.

Мол,

NSMutableArray *titleArray = [[NSMutableArray alloc] init]; 

для всех массив, который вы используете в CellForRowAtIndexPath метод для демонстрации записей.

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

Примечание: В соответствии с вашим вопросом вы получаете нулевой массив, поэтому, пожалуйста, проверяйте данные решения.

+0

Он также сказал, что он получает счет как 10 ранее. – kerry

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