NSThread для UITableView - PullRequest
       20

NSThread для UITableView

1 голос
/ 24 января 2011

В методе контроллера вида viewDidLoad(), который я вызываю,

[NSThread detachNewThreadSelector:@selector(readFromFaceBook) 
                         toTarget:self 
                       withObject:nil];

readFromFaceBook извлечет данные из удаленного местоположения и заполняет данные в NSMutabaleArray, называемые «myData».Контроллер представления содержит tableView, который загружает данные из myData.

Проблема, с которой я столкнулся, заключается в том, как отложить выполнение делегатов tableView до тех пор, пока поток не загрузит все данные в myData. ??Программа аварийно завершает работу, поскольку функции делегатов пытаются выполнить с использованием myData.Любая помощь с благодарностью ... !!!!

Ответы [ 3 ]

1 голос
/ 24 января 2011

Вы должны создать табличное представление и показать его немедленно, чтобы пользователь не думал, что ваше приложение не работает. Возможно UIProgressIndicator или что-то, что показывает, что вы что-то делаете?

Ваш фоновый поток должен выполнять загрузку, как вы правильно выбрали. Когда это будет сделано, перезвоните основному потоку через performSelectorOnMainThread:... или dispatch_async() на dispatch_get_main_queue() и вызовите [myTableView reloadData], чтобы обновить пользовательский интерфейс.

Чтобы предотвратить преждевременную загрузку таблицы, вы можете воспользоваться несколькими подходами. Предположительно, вы храните свои данные в массиве, поскольку UITableView отображает упорядоченные данные. Если так, то просто не заполняйте массив, пока поток не закончится. Если это не сработает, вы можете просто использовать BOOL ivar, который вы используете, чтобы указать, закончили ли вы загрузку, а затем использовать состояние BOOL, чтобы определить, что вы должны показать в своем UITableView.

1 голос
/ 24 января 2011

Вы можете сделать две вещи: создать экземпляр tableView после получения данных или позвонить [tableView reloadData] после получения обратного вызова, сообщающего, что ваши данные загружены.

0 голосов
/ 24 января 2011

Ваш вторичный поток не должен обрабатывать работу пользовательского интерфейса.

Как только вы получите обратный вызов при загрузке, и данные будут в коллекции "myData" - вызовите функцию в контексте основного потока, скажем, выВызов UpdateTable:.

Используйте следующий API для этого

[self performSelectorOnMainThread:@selectore(UpdateTable:) withObject:<#(id)arg#> waitUntilDone:<#(BOOL)wait#>

В UpdateTable

- (void)UpdateTable:(id)inData
{
    [<view object> reloadData];
}
...