Переключение вкладок (изначально) очень медленное - Переместить функцию из viewDidLoad? - PullRequest
0 голосов
/ 11 февраля 2011

В моем приложении для 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 - код был вызвал, но как мне убедиться, что проанализированные статьи загружаются обратно в мое табличное представление?

1 Ответ

3 голосов
/ 11 февраля 2011

Оказывается, мне нужно было перезагрузить свой 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 не отображает проанализированные данные

...