Отправка работает некорректно

Я пытаюсь получить некоторые данные в фоновом режиме и обновить табличное представление при вводе в строку поиска, вот мой текущий код:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        Games * game = [[Games alloc] init];
        NSArray * temp = [game comingSoonWithPlatform:@"pc" header:[game gameHeader] parseLink:[game gameComingSoonListLinkWithPlatform:@"pc"]];
        self.searchArray = [temp valueForKey:@"results"];
        [self.tableView reloadData];
    });
}

Что я делаю не так? Если я наберу еще одно слово в строке поиска или нажму кнопку отмены, она обновится, и данные появятся в табличном представлении.


person pluck    schedule 21.04.2015    source источник


Ответы (2)


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

Например, вы можете выполнять кодирование в следующем методе:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    // [activityIndicator startAnimating];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // do your background code here
        Games * game = [[Games alloc] init];
        NSArray * temp = [game comingSoonWithPlatform:@"pc" header:[game gameHeader] parseLink:[game gameComingSoonListLinkWithPlatform:@"pc"]];
        self.searchArray = [temp valueForKey:@"results"];

        dispatch_sync(dispatch_get_main_queue(), ^{
            // you are now on the main queue again, update ui here  
        //[activityIndicator stopAnimating];
        [self.tableView reloadData];
        });
    });
}
person Sanjay Mohnani    schedule 21.04.2015
comment
Вы также должны поместить назначение self.searchArray внутри отправки в основную очередь. (Это объект, который вы используете из основного потока, поэтому вам не следует изменять его из фонового потока. Синхронизируйте свой доступ, проще всего добиться, просто поместив это назначение внутри блока, который вы отправляете обратно в основной поток. ) Кроме того, здесь нет необходимости в dispatch_sync. dispatch_async было бы предпочтительнее. - person Rob; 21.04.2015

Вызов [self.tableView reloadData]; должен быть в основном потоке. Заменить строку

[self.tableView reloadData];

с

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});
person dasdom    schedule 21.04.2015