Показать экран загрузки при разборе, а затем обновить UITableView? - PullRequest
2 голосов
/ 21 августа 2009

У меня есть UITableView со следующим кодом:

- (void)viewDidLoad {
    [super viewDidLoad];
    parser = [[XMLParser alloc] init];
    [parser parseXML];

Моя проблема в том, что запуск занимает слишком много времени, потому что он анализирует все перед отображением контроллера представления с UITableView. Кроме того, если я настраиваю другой UITableView и анализирую другой XML (на другой вкладке), я нажимаю, чтобы перейти на другую вкладку, но затем он зависает, когда анализирует другой XML, и, как только это будет сделано, он отображает UITableView. *

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

У кого-нибудь есть идеи?

Ответы [ 2 ]

3 голосов
/ 26 августа 2009

Вы можете назвать что-то вроде

[parser performSelectorInBackground:@selector(parseXML) withObject:nil];

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

[self performSelectorOnMainThread:@selector(XMLUpdated:) withObject:self waitUntilDone:NO];
1 голос
/ 21 августа 2009

Если под загрузкой экрана вы имеете в виду индикатор активности, то попытка добавить анимированный индикатор перед синтаксическим анализом потенциально может не сработать, поскольку при анализе в главном потоке он блокируется и не позволяет индикатору появиться на экране. Чтобы обойти это, я бы выполнил синтаксический анализ в фоновом потоке, это должно позволить вашему индикатору появиться, когда синтаксический анализ завершен, а объект синтаксического анализа отправляет сообщение вашему viewController, чтобы он знал, что он готов показать табличное представление. (я должен отметить, что UIKit не является потокобезопасным, и вы не должны пытаться обновить какие-либо элементы пользовательского интерфейса из фонового потока без использования executeSelectorInMainThread)

...