Iphone 切换选项卡(最初)非常慢-将功能移出viewDidLoad?

Iphone 切换选项卡(最初)非常慢-将功能移出viewDidLoad?,iphone,performance,ios,viewdidload,Iphone,Performance,Ios,Viewdidload,在我的iPhone应用程序中,我使用UITabBarController设置了三个选项卡。第一个选项卡(在应用程序启动时加载)使用本地数据加载,速度非常快 但是,第二个选项卡从web下载XML文件并对其进行解析,然后在UITableView中显示所有数据,通过较慢的连接(EDGE,3G)加载需要很长时间。而且,由于我确实在viewdiload内部调用了我的解析器,所以在完成所有操作之前,应用程序不会切换到我的第二个选项卡。这意味着有时需要花费一些时间来加载选项卡,而且看起来应用程序被锁定了 我希

在我的iPhone应用程序中,我使用
UITabBarController
设置了三个选项卡。第一个选项卡(在应用程序启动时加载)使用本地数据加载,速度非常快

但是,第二个选项卡从web下载XML文件并对其进行解析,然后在
UITableView
中显示所有数据,通过较慢的连接(EDGE,3G)加载需要很长时间。而且,由于我确实在
viewdiload
内部调用了我的解析器,所以在完成所有操作之前,应用程序不会切换到我的第二个选项卡。这意味着有时需要花费一些时间来加载选项卡,而且看起来应用程序被锁定了

我希望能够让用户切换到该选项卡,立即加载视图(即使是空的),然后下载/解析/显示数据。我有网络活动微调器,所以至少用户可以知道发生了什么

这是我当前的
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-调用了该代码,但是,如何确保已解析的项目被加载回我的表视图?

事实证明,在将数据加载到辅助线程后,我需要重新加载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,这就解决了所有问题

下面是我的次要线程+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];
}

有人提醒我从下面的回答中刷新表视图:

而且,在第一次加载数据后,我切换到另一个选项卡并返回,一切都很快(因为viewDidLoad只在第一次加载视图时调用,并且在内存不足的情况下…)。发现了这个--然后,我猜,问题是:我如何将解析器卸载到后台线程中?而且,在第一次加载数据后,我切换到另一个选项卡并返回,一切都很快(因为viewDidLoad只在第一次加载视图时调用,并且在内存不足的情况下…。找到了这个--然后,我猜,问题是:如何将解析器卸载到后台线程中?似乎最近我自己已经回答了大部分问题。。。这是怎么回事?看来我最近一直在回答我的大部分问题。。。这是怎么回事?