2015-09-18 1 views
0

Я по-прежнему новичок в использовании NSURL для получения данных и, как представляется, имеет проблемы при попытке использовать это. В этом случае я использую debug для проверки всей даты, входящей в ViewDidload, и все правильные данные поступают и разделяются на массивы, которые я затем хочу использовать для создания моего контроллера представления таблиц. Однако, когда мы достигаем метода NumberOfRows в разделе, все массивы, похоже, были сброшены на нуль. Я пробовал использовать различные комбинации решений NSURL, но ни один из них не кажется дальше, чем тот, который я использую прямо сейчас (что, по крайней мере, показывает некоторые данные, поступающие). Может кто-нибудь, пожалуйста, сообщите мне, если я сделаю очевидную ошибку, или если не дать мне надежный кусок кода, который я должен использовать для выполнения простого GET, подобного этому. спасибо.Проблемы с загрузкой табличного представления с данными, полученными с использованием NSURL

Здесь ниже моего кода:

@implementation MyLessonsTableViewController 

    NSArray *pastarr = nil; 
    NSArray *todoarr = nil; 
    NSArray *comingarr = nil; 
    NSArray *jsonless = nil; 


- (void)viewDidLoad { 
    [super viewDidLoad]; 


    // GET MY LESSONS FROM DATABASE 

    jsonless = [[NSArray alloc] init]; 
    pastarr = [[NSArray alloc] init]; 
    todoarr = [[NSArray alloc] init]; 
    comingarr = [[NSArray alloc] init]; 

    NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a"; 
    NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token]; 

    NSURL *urlcc = [NSURL URLWithString:urlString]; 
    NSData *data = [NSData dataWithContentsOfURL:urlcc]; 
    NSError *error; 
    NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions 
                    error:&error]; 

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

    NSLog(@"My Lessons Json == %@", jsonLess); 

    // SPLIT ARRAY 

    NSArray *pastarr = [jsonLess valueForKeyPath:@"past"]; 
    NSArray *todoarr = [jsonLess valueForKeyPath:@"todo"]; 
    NSArray *comingarr = [jsonLess valueForKeyPath:@"upcoming"]; 



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    // Return the number of sections. 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    // Return the number of rows in the section. 
    NSUInteger lessonRowCount = 0; 
    switch (section) { 
     case 0: 
      lessonRowCount = todoarr.count; 
      break; 
     case 1: 
      lessonRowCount = comingarr.count; 
      break; 
     case 2: 
      lessonRowCount = pastarr.count; 
      break; 

     default: 
      break; 

    } 

    return lessonRowCount; 

} 

ответ

1

Несколько вопросов.

  1. Вы звоните reloadData ненужно в dispatch_async.
  2. Вы вызываете reloadData, прежде чем обрабатывать jsonLess.
  3. Вы никогда ничего не назначаете своим иварам массива.
  4. У вас на самом деле нет ivars для ваших массивов. У вас есть глобальные переменные.

Вот Опубликованный код все устроились:

@implementation MyLessonsTableViewController { 
    NSArray *pastarr = nil; 
    NSArray *todoarr = nil; 
    NSArray *comingarr = nil; 
}  

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // GET MY LESSONS FROM DATABASE 
    NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a"; 
    NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token]; 

    NSURL *urlcc = [NSURL URLWithString:urlString]; 
    NSData *data = [NSData dataWithContentsOfURL:urlcc]; 
    NSError *error; 
    NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions 
                    error:&error]; 

    NSLog(@"My Lessons Json == %@", jsonLess); 

    // SPLIT ARRAY 
    pastarr = [jsonLess valueForKeyPath:@"past"]; 
    todoarr = [jsonLess valueForKeyPath:@"todo"]; 
    comingarr = [jsonLess valueForKeyPath:@"upcoming"]; 

    [self.tableView reloadData]; 
} 

Теперь это до сих пор страдает от одной большой проблемы. Вы делаете доступ в Интернет по основному потоку. Плохо. Вы действительно должны это сделать так:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // GET MY LESSONS FROM DATABASE 
    NSString *token = @"5cfd28bed3f5f5bd63143c81a50d434a"; 
    NSString *urlString = [NSString stringWithFormat:@"http://soon.nextdoorteacher.com/apps/api/nextdoorteacher/student-lessons?t=%@", token]; 

    NSURL *urlcc = [NSURL URLWithString:urlString]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSData *data = [NSData dataWithContentsOfURL:urlcc]; 
     NSError *error; 
     NSMutableDictionary *jsonLess = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions 
                    error:&error]; 

     NSLog(@"My Lessons Json == %@", jsonLess); 

     // SPLIT ARRAY 
     pastarr = [jsonLess valueForKeyPath:@"past"]; 
     todoarr = [jsonLess valueForKeyPath:@"todo"]; 
     comingarr = [jsonLess valueForKeyPath:@"upcoming"]; 

     // Now this must be done on the main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
    }}; 
} 
+0

Да, это хорошо работает сейчас. Большое спасибо @rmaddy – Kitcc