Ошибка XMLParser с NSThread - PullRequest
       30

Ошибка XMLParser с NSThread

1 голос
/ 08 апреля 2011

У меня есть приложение, в котором я загружаю свои XML-данные через NSXMLParser в UITableView. Это все работало отлично. Поскольку я хотел добавить ActivityIndicator, я должен поместить свои загрузочные данные в другой поток, а не в основной. После того, как я это сделал, XML загружается так же, как и мое приложение, но я ничего не вижу в своей таблице. Когда я нажимаю на другую вкладку моего tabbarcontroller и затем возвращаюсь назад к таблице, данные в таблице становятся видимыми. Что не так?

Мой файл:

#import "DAFAppDelegate.h"
#import "RootViewController.h"
#import "XMLParser.h"


@implementation DAFAppDelegate

@synthesize window;
@synthesize navigationController;
@synthesize rootViewController;
@synthesize rootTabController;
@synthesize stages;

+ (void) showAlert
{
    UIAlertView *av = [[[UIAlertView alloc] initWithTitle:@"No Connection" message:@"Could not retrieve data" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [av show];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    [window addSubview:[rootTabController view]];
    [window makeKeyAndVisible];

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

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

    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    NSURL *url = [[NSURL alloc] initWithString:@"http://web.me.com/ijar/Stages.xml"];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];

    //Initialize the delegate.
    XMLParser *parser = [[XMLParser alloc] initXMLParser];

    //Set delegate
    [xmlParser setDelegate:parser];

    //Start parsing the XML file.
    BOOL success = [xmlParser parse];

    if(success)
    {
        NSLog(@"No Errors");
    }
    else
    {
        [DAFAppDelegate showAlert];
        NSLog(@"Error Error Error!!!");
    }  

    [pool release];

}

- (void)dealloc
{
    [navigationController release];
    [rootViewController release];
    [rootTabController release];
    [window release];
    [stages release];
    [super dealloc];
}

@end

1 Ответ

0 голосов
/ 08 апреля 2011

Вы звонили reloadData на вашем столе?Также вы должны отправить сообщение в табличное представление, используя -performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait.

. Вы должны отправить эти сообщения, если ваш парсер успешно завершился.

if (succeed)
{
   [myTableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}

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

...