Переключение вкладок (изначально) очень медленное - переместить функцию из viewDidLoad?

В моем приложении для iPhone у меня есть три вкладки с использованием UITabBarController. Первая вкладка (которая загружается при запуске приложения) использует для загрузки локальные данные и выполняется очень быстро.

Вторая вкладка, которая загружает XML-файл из Интернета и анализирует его, а затем отображает все данные в виде UITableView, долго загружается при более медленных соединениях (EDGE, 3G). И поскольку я вызываю свой синтаксический анализатор внутри viewDidLoad, приложение не переключится на мою вторую вкладку, пока все не будет сделано - это означает, что иногда требуется время для загрузки вкладки, и похоже, что приложение заблокировано.

Я бы предпочел, чтобы пользователь переключился на эту вкладку, сразу загрузил представление, даже если оно пусто, а затем данные были загружены / проанализированы / отображены. У меня вращается счетчик сетевой активности, поэтому, по крайней мере, пользователь может знать, что что-то происходит.

Вот мой текущий viewDidLoad:

// Load in the latest stories when the app is launched.
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"Loading news view");

    articles = [[NSMutableArray alloc] init];

    NSURL *url = [NSURL URLWithString:@"http://example.com/mobile-app/latest-news.xml"];
    NSLog(@"About to parse URL: %@", url);
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
}

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


person geerlingguy    schedule 10.02.2011    source источник
comment
Кроме того, после того, как данные загружаются в первый раз, и я переключаюсь на другую вкладку и обратно, все происходит быстро (потому что viewDidLoad вызывается только при первой загрузке представления и после условий нехватки памяти ...).   -  person geerlingguy    schedule 11.02.2011
comment
Нашел это - stackoverflow.com/questions/2987672/ - тогда, думаю, возникает вопрос: как выгрузить парсер в фоновый поток?   -  person geerlingguy    schedule 11.02.2011


Ответы (1)


Оказывается, мне нужно было перезагрузить UITableView после загрузки данных во вторичный поток, и это все исправляет!

Вот последний код в моем вторичном потоке + функция viewDidLoad:

-(void)initilizeNewsViewWithData {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Start the network activity spinner in the top status bar.
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

    articles = [[NSMutableArray alloc] init];
    NSURL *url = [NSURL URLWithString:@"http://example.com/mobile-app/latest-news.xml"];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    parser.delegate = self;
    [parser parse];
    [tblLatestNews reloadData]; // Need to refresh the table after we fill up the array again.

    [pool release];
}

// Load in the latest news stories in a secondary thread.
- (void)viewDidLoad {
    [super viewDidLoad];

    [self performSelectorInBackground:@selector(initilizeNewsViewWithData) withObject:nil];
}

Мне напомнили об обновлении представления таблицы из этого ответа: UITableView не отображает проанализированные данные < / а>

person geerlingguy    schedule 11.02.2011
comment
Похоже, я сам отвечал на большинство своих вопросов в последнее время ... что с этим, ТАК? - person geerlingguy; 16.02.2011