2013-10-05 4 views
1

Я новичок в разработке iOS и борьбе с UITableViews.Почему я не могу перезагрузить таблицу

Моя проблема заключается в том, что я заполняю свой UITableView данными с внешнего сервера, но из-за многопоточности он не дожидается, пока данные не поступят до загрузки представления таблицы.

Моя нынешняя идея - перезагрузить представление таблицы при загрузке данных.

Ранее в одном классе DailyBreakdown.c, я перезагружать вид таблицы с помощью этого кода:

-(void)viewWillAppear:(BOOL)animated 
{ 

    [[self class] getAllActivities]; 

    [super viewWillAppear:animated]; 
    [self makeObjects]; 
    [self.tableView reloadData]; 
} 

Так на обратный вызов, когда мои нагрузки данных (с помощью Restkit), я пытаюсь вызвать [self.tableView reloadData ] еще раз, но я получаю ошибки:

Определение «структуры objc_class» должны быть импортированы из модуля «ObjectiveC.runtime» до того, как требуется

неявной удобст rsion из Objective-C типа указателя «класс» на C указатель типа «структура objc_class *» требует мостика отливать

Вот метод, где я вернуть объекты активности из API:

+(NSArray *)getAllActivities{ 

    if (allActivities == nil) { 
     // Load the object model via RestKit 
     //allActivities = [[NSMutableArray alloc] initWithObjects:@"Workout", @"Baked cake", @"Read for HR", nil]; 
     allActivities = [[NSMutableArray alloc] init]; 
     RKObjectManager *objectManager = [RKObjectManager sharedManager]; 

     [objectManager getObjectsAtPath:@"/activities" 
          parameters:nil 
           success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
            //allActivities = [mappingResult array]; 
            allActivities = [NSMutableArray arrayWithArray: [mappingResult array]]; 
            [[self class] makeObjects]; 

            /*** THIS LINE IS THE PROBLEM **/ 
            [self.tableView reloadData]; 
           } 
           failure:^(RKObjectRequestOperation *operation, NSError *error) { 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                        message:[error localizedDescription] 
                        delegate:nil 
                      cancelButtonTitle:@"OK" 
                      otherButtonTitles:nil]; 
            [alert show]; 
            NSLog(@"Hit error: %@", error); 
           }]; 
    } 

    return allActivities; 

} 

Итак, почему я не могу называть [self.tableView reloadData], как раньше? Как мне это сделать изнутри метода класса?

Кроме того, есть ли лучший способ выполнить это, помимо перезагрузки таблицы? Может быть, threadlocking, чтобы allActivities не возвращал нуль при загрузке представления? Любые идеи приветствуются.

Спасибо!

ответ

1

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

Другие решения этой проблемы:

  • вы можете добавить блок аргумент getAllActivities, который будет вызываться, когда вызов внешней службы завершается успешно; В этом блоке вы загрузите таблицу
  • вы можете передать ваш экземпляра self в getAllActivities и использовать его для доступа tableView

Еще одна вещь, которую я заметил, - return allActivities; не будет содержать результаты последнего RestKit вызова , потому что он будет выполнен до завершения вызова.

+0

Работал! Спасибо! Различие между методами класса и экземпляра ссылается на меня, поэтому мне придется исследовать это. Но теперь мой tableView заполняется данными сервера, что является огромной вехой! Спасибо! – corbin

+1

http://stackoverflow.com/a/11174572/1990236 вот неплохое объяснение методов экземпляра и класса в Objective-C –

1

Ваш метод getAllActivities определяется как метод уровня (потому что он имеет префикс с плюсом). То, что вы, вероятно, хотели сделать, это определить метод уровня экземпляра (с минусом вместо плюса).

-(NSArray *)getAllActivities 

Следующая вещь, которую я замечаю, что вы ни делаете что-либо с результатом от вызова, ни является результатом того, что вы ожидали бы. Ваш getObjectsAtPath RKObjectManager является асинхронным и немедленно вернется. Это означает, что значение для allActivities почти всегда будет пустым массивом. Таким образом, вы можете дополнительно повторно определить свой метод как:

-(void)getAllActivities{ 
    //... 
    //No return here! 
} 

И, наконец, так как ваш метод не является действительно «получение» деятельность на всех, вы могли бы рассмотреть, назвав его к чему-то вроде:

-(void)reloadAllActivities 
Смежные вопросы