Проблема с потоками Objective C и обновлениями GUI - PullRequest
4 голосов
/ 15 мая 2011

Я разрабатываю приложение для iOS с представлением, содержащим TableView.Какой-то метод получает данные из Интернета, открывает новый поток для вычисления информации и вставляет строку в таблицу во время выполнения с помощью метода: insertRowsAtIndexPaths.

Теперь, если много данных поступает одновременно,таблица может обновляться сама после нескольких вставок, а не после каждой, и это вызывает исключение, говорящее о том, что число строк в разделе неправильное (это потому, что она думает, что должна иметь приращение в одну строку, но потоки уже вставленымассив данных (еще несколько ячеек).

Даже если я заблокирую вставку в массив источника данных и метод insertRowsAtIndexPaths, он все равно будет действовать.

NSLock *mylock = [[NSLock alloc] init];
[mylock lock];

[array addObject:object];

[tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];

[mylock unlock];

помогите пожалуйста,

Спасибо!

1 Ответ

9 голосов
/ 15 мая 2011

вы должны запустить этот метод в главном потоке. Все взаимодействие с пользовательским интерфейсом должно выполняться в главном потоке.

Допустим, ваш метод выглядит следующим образом:

- (void)addSomeObject:(id)object {
    [array addObject:object];
    [tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];
}

и вы называете это так:

[self addSomeObject:anObject];

тогда вы бы изменили этот вызов на что-то вроде этого:

[self performSelectorOnMainThread:@selector(addSomeObject:) withObject:anObject waitUntilDone:NO];
...