sendAsynchronousRequest с табличным представлением reloadData задержка при отрисовке - PullRequest
5 голосов
/ 17 ноября 2011

Я пытаюсь использовать новый sendAsynchronousRequest, добавленный в iOS5. У меня есть класс модели (File) с методом, который запрашивает некоторые данные с сервера, а затем передает эти данные в класс контроллера (FilesController), который создал объект модели.

В классе модели есть метод со следующим кодом:

[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSArray *files = [self _dictionariesToFiles:decodedResponse];
    handler(files);
}];

Класс контроллера, использует его так:

[File findAll:conditions completionHandler:^(NSArray *files) {
    dataSource = files;

    NSLog(@"set");

    [self.tableView reloadData];

    NSLog(@"reload");

    activityIndicator.hidden = TRUE;
}];

В консоли я могу сразу увидеть, как NSLogs показывает сообщения «set» и «reload», но таблица и индикатор не изменяются, пока не пройдет несколько секунд (5-10 с).

Кто-нибудь знает, в чем проблема?

Спасибо.

PD: Я изменил асинхронный запрос на совместимый синхронизированный, и затем проблема исчезла, но я хочу использовать для этого асинхронный запрос.

Это совместимый код синхронизации:

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSArray *decodedResponse = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSArray *files = [self _dictionariesToFiles:decodedResponse];
handler(files);

Ответы [ 2 ]

16 голосов
/ 17 ноября 2011

нужно сделать [tableView reloadData] в главном потоке.Все операции пользовательского интерфейса должны выполняться в основном потоке.Несколько способов сделать это.Один из них:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
    activityIndicator.hidden = TRUE;
});

РЕДАКТИРОВАТЬ: добавлен индикатор активности к примеру

3 голосов
/ 06 января 2012

У меня было несколько проблем с использованием: [[NSOperationQueue alloc] init], но с использованием [NSOperationQueue mainQueue] все идеально. При использовании новой очереди строка выполнения не следует естественной последовательности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...