解析器(在单独的线程上)完成后添加UIButton

时间:2010-06-30 19:02:17

标签: iphone iphone-sdk-3.0

我一直在尝试在解析器(在单独的线程上)完成后添加一个按钮。我知道你不能在除主线程之外的任何线程上与UI元素进行交互。

我不想使用计时器或while语句...所以我的问题是

解析器完成后,您建议我将按钮添加到视图中吗?我之前不希望它添加,因为用户将获得一个空白表。我也不想在完成后重新加载表,因为这给我带来了其他问题。

主线程上的performSelector对我来说似乎也不起作用..?我有点迷失在这里...

有什么建议吗?


这是我开始另一个线程启动解析器的地方(在AppDelegate中)

// begin background downloads
[NSThread detachNewThreadSelector:@selector(parseNewData) toTarget:self withObject:nil];

我的parseNewData函数(在AppDelegate中)

-(void)parseNewData {

    //start network activity spinner and release controller when done
    RootViewController * root = [[RootViewController alloc] init];
    [root downloadIcon];
    [root release];

    //create pool to avoid memory leak
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


    // get the XML path and start parsing
    NSURL *pathURL = [NSURL URLWithString:@"http://www.mysite.com/file.xml"];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:pathURL];
    [parser setDelegate:self];
    [parser parse];

    //drain pool 
    [pool drain];
    [pool release];

}

解析器完成(在AppDelegate中)

- (void)parserDidEndDocument:(NSXMLParser *)parser
{

    // parser is finished, we can now kill the network activity icon on root view controller
    RootViewController * root = [[RootViewController alloc] init];
    [root killDownloadIcon];
    [root performSelectorOnMainThread:@selector(unhideShowtimesButton) withObject:nil waitUntilDone:NO];
    [root release];

}

我的unhideShowtimesButton on(在RootViewController中)

-(void)unhideShowtimesButton {
    showtimesButton.hidden = FALSE;
}

我正在使用unhideShowtimesButton(通过断点验证),但它只是完全忽略了hidden = False。

1 个答案:

答案 0 :(得分:2)

您正在每个函数中创建一个新的RootViewController实例。这看起来不错。您应该在整个代码中只使用一个实例。我的直觉是,由于RootViewController实例不同,您尝试隐藏的showTimesButton实例与正在显示的实例不同。