2010-12-27 5 views
0

Я пытаюсь работать с онлайн-данными в своем приложении для iPhone. Но я злюсь из-за этого:UITableView reloaddata не перезагружается немедленно

У меня есть объект для загрузки данных с NSURLConnection. Метод, начинающий работу с подключением (и другими материалами) в отдельной резьбе - [ NSThread detachNewThreadSelector:@selector(doConnectionInNewThread) toTarget: self withObject: nil ];

Когда данные загружаются (connectionDidFinishLoading), я передаю их в свой диспетчер viewController. Все это прекрасно работает. Когда я использую точки останова или NSLog, у меня есть данные, готовые для отображения в UITableView. Когда я вызываю reloadData, ничего не происходит сразу. Он перезагружает данные через 2 секунды (после этой задержки вызывается - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath).

НО, когда я сдвигаю таблицуView, он немедленно перезагружает данные. Таким образом, соединение и т. Д. Отлично работает, но просто не перезагружает данные. Зачем? Я думал, что это может быть из-за блокировки mainThread по URLConnection. Но теперь я использую его в отдельном потоке, и он все тот же ...

ответ

2

Доступен ли ваш столик в отдельном потоке?

Убедитесь, что обновление пользовательского интерфейса на главном потоке с помощью:

-performSelectorOnMainThread: withObject: waitUntilDone:

+0

гм. Итак, теперь я запускаю свою объектную функцию с подключаемым файлом обычно (ни в одном отсоединенном потоке), но когда я получаю все необходимые данные, я вызываю «-performSelectorOnMainThread: withObject: waitUntilDone:», чтобы сообщить моему диспетчеру просмотра reloadData, и он работает отлично. Спасибо! Какая уловка? Название говорит что-то вроде «сделайте это на mainThread без терпения». Таким образом, он останавливает предыдущее URLConnection или что? – D33

+0

Доступ к конечному автомату пользовательского интерфейса в основном потоке, как правило, не поддерживается. В частности, reloadData отмечает представление таблицы как необходимость отображения для перезагрузки данных (т. Е. Данные перезагрузки ленивы). Поскольку вы не находитесь в основном потоке, планирование отображения, вероятно, неверно. – Julien

+0

Вы также НЕ ДОЛЖНЫ манипулировать одной и той же коллекцией (изменяемым массивом или словарем), которую вы используете при отображении данных из фонового потока, по крайней мере, без соответствующей блокировки. Вы не можете добавлять объекты в NSMutableArray или NSMutableDictionary из одного потока при чтении с него на другом. –

Смежные вопросы