WedX - журнал о программировании и компьютерных науках

Почему этот UIButton/IBAction не обновляет мою страницу?

Когда я загружаю свой основной вид, он автоматически загружает канал JSON с сообщениями в блоге.

У меня есть кнопка обновления на верхней панели основного представления. Я уже успешно подключил его к IBAction, и при нажатии я могу вывести строку в журнал.

Я пытаюсь заставить свое представление перезагружать фид JSON, когда я нажимаю кнопку обновления, но это не работает.

Что я делаю не так?

Мой ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UICollectionViewController {
    NSArray *posts;
}

- (void)fetchPosts;

- (IBAction)refresh:(id)sender;
@end

Мой ViewController.m

...

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self fetchPosts];
}

- (IBAction)refresh:(id)sender {

    [self fetchPosts];
}

- (void)fetchPosts
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"https://website.com/app/"]];

        NSError* error;

        posts = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

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

  • Удалось ли загрузить данные? 03.10.2012
  • Вы пытаетесь обновить UILabel? Где твой UILabel? Это в другом контроллере представления? Вы пытаетесь обновить весь контроллер представления? Просмотрите контроллеры, выполняющие обновление, когда вы переключаетесь на другой. 03.10.2012
  • Вы пытаетесь перезагрузить представление, фактически не перезагружая его? Является ли collectionView UITableView, успешно подключенным к построителю интерфейса, ссылающемуся на выход? Пожалуйста, предоставьте больше информации и больше вашего кода. 03.10.2012
  • @DrummerB - я не вижу, так как содержимое страницы остается прежним, хотя есть новые записи 03.10.2012
  • @user1392515 user1392515 - нет, пытаюсь обновить весь collectionView, который отображается в главном представлении - было бы нормально перезагрузить MasterView 03.10.2012
  • Вы пытались сделать NSLog для переменной POSTS прямо перед вызовом reloadData? Попробуйте это, чтобы увидеть, действительно ли массив POSTS содержит правильные данные, которые вам нужны. 03.10.2012
  • это так, потому что fetchPosts - это то, что на самом деле загружает сообщения в основной вид для начала - я просто хотел бы иметь возможность делать то же самое по запросу, нажав кнопку обновления 03.10.2012

Ответы:


1

Пост не обновляется, как вы ожидаете, поскольку он захватывается внутри асинхронного блока. Если я правильно помню, переменные экземпляра копируются после передачи в блок, поэтому их изменения не отражаются за пределами асинхронного блока, если они не имеют модификатора __block.

Попробуй это,

- (void)fetchPosts
{
    __block NSArray *blockPosts = posts;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString: @"https://website.com/app/"]];

        NSError* error;

        blockPosts = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.collectionView reloadData];
        });
    });
}
03.10.2012
  • Гарольд, так что этот код будет вызываться для начальной загрузки И вызываться при нажатии для обновления? или это должно быть конкретно для обновления? 04.10.2012
  • Да. Это вызывается для начальной загрузки, И всякий раз, когда кто-то нажимает кнопку обновления... ИМХО 04.10.2012
  • ваш код выдает ошибку синтаксического анализатора в строке 3 (__block...) -- incompatible pointer types initializing NSJSONSerialization *__strong with an expression 05.10.2012
  • Прости за это. Я обновил код, изменив тип переменной __block на NSArray; это основано на предположении, что ваша переменная posts является массивом. Это правильно? 06.10.2012
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]