RSS в другом потоке не работает, но отлично работает в основном потоке

Я пытаюсь получить синтаксический анализатор rss в другом потоке в своем приложении для iphone, но когда я это делаю, я получаю только индикатор вращения (т. Е. Ничего). Но если я закомментирую вызов [NSThread....] в viewDidAppear и раскомментирую строку [self loadData], все будет работать (но тогда это не в другом потоке). Я что-то пропустил? Спасибо за любую информацию, которую вы можете предоставить здесь!

Вот код.

- (void)viewDidAppear:(BOOL)animated {

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

              //[self loadData];

    [super viewDidAppear:animated];
}



- (void)loadData {

         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    if (items == nil) {
        [activityIndicator startAnimating];

        Parser *rssParser = [[Parser alloc] init];
        [rssParser parseRssFeed:@"http://www.mywebsite.com/xml" withDelegate:self];

        [rssParser release];

    } else {
        [self.tableView reloadData];
    }
        [pool release];
}

person Allen    schedule 19.11.2010    source источник


Ответы (1)


Все изменения пользовательского интерфейса должны быть сделаны в основном потоке:

- (void)viewDidAppear:(BOOL)animated {

    if (items == nil)
    {
        [activityIndicator startAnimating];
        [NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];
    }
    else
    {
        [self.tableView reloadData];
    }
    [super viewDidAppear:animated];
}

- (void)loadData {

        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        Parser *rssParser = [[Parser alloc] init];
        [rssParser parseRssFeed:@"http://www.mywebsite.com/xml" withDelegate:self];
        [rssParser release];

        [pool release];
}

Убедитесь, что items равно нулю, если да, запустите анимацию индикатора и затем запустите новый поток.

person Evan Mulawski    schedule 19.11.2010
comment
Спасибо .. Это имеет смысл, но я только что попробовал, но это все равно приводит только к вращению индикатора. Опять же, если я закомментирую строку NSThread и в этот момент вставлю [self loadData], это сработает, что наводит меня на мысль, что что-то с вызовом NSThread неверно или что-то в этом роде... как вы думаете? - person Allen; 19.11.2010
comment
Согласно этому: iphoneexamples.com, вы правильно используете многопоточность. Вы пробовали performSelectorInBackground:? - person Evan Mulawski; 19.11.2010
comment
Да, это работает, и теперь я удивляюсь, почему одно работает, а другое нет.. кажется странным - person Allen; 19.11.2010
comment
Можете ли вы попробовать viewDidLoad вместо viewDidAppear? - person Evan Mulawski; 19.11.2010
comment
Да.. только что попробовал, но это не работает, и даже индикатор вращения не показывает.. очень озадачивает - person Allen; 19.11.2010
comment
Это странно. Не могли бы вы попробовать performSelectorOnMainThread:? Это должно работать несмотря ни на что. - person Evan Mulawski; 19.11.2010
comment
Да, если я использую PerformSelectorOnMainThread, он работает, но как только я изменяю его на PerformSelectorinBackground, он не работает. Поскольку detachNewThreadSelector также помещает его в другой поток, и это не работает, похоже, проблема заключается в получении потока, отличного от основного потока. В любом случае, спасибо, что помогли мне в этом. - person Allen; 19.11.2010