0

我正在尝试提高我的应用程序的响应能力,在查看调试器控制台时,我注意到该应用程序似乎两次检索 XML 数据。. . 也就是说,当页面出现时,我调度一个后台队列去获取一些 xml 数据,解析它,并返回一个对象数组。我使用 nslog 在控制台中输入数据字符串,并且由于某种原因它打印了两次。这是我的相关代码:

在 VC 中:

-(void)startBackgroundQueue{
dispatch_async(backgroundThread, ^(void){
    SDJConnection *connection = [[SDJConnection alloc]init];
    self.dataArray = [connection getVideoData];

    [[NSNotificationCenter defaultCenter]postNotificationName:@"tube_data_loaded" object:nil];
    });
}

SDJConnection 中的 getVideoData 方法如下所示:

-(NSMutableArray *)getVideoData {

NSURL *dataURL = [[NSURL alloc]initWithString:@"https://gdata.youtube.com/feeds/api/users/dancingastronaut/uploads?start-index=1&max-results=10"];
NSData *data = [[NSData alloc]initWithContentsOfURL:dataURL];

NSString *dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"data string: %@",dataString);

YouTubeParser *parser = [[YouTubeParser alloc]initWithData:data];
[parser setDelegate:parser];

[parser parse];

    return [parser videosArray];

}

然后VC执行以下代码:

-(void)backgroundQueueDone{
dispatch_async(dispatch_get_main_queue(),^(void){
    [activityIndicator stopAnimating];
    if ([_dataArray count] >1) {
        self.tableView.separatorColor = [UIColor darkGrayColor];
        [self.tableView reloadData];}                
});
}

我不确定这是否是一个问题,但我担心我以某种方式运行两次会浪费资源。关于可能发生的事情有什么想法吗?

谢谢!

4

1 回答 1

1

您有可能两次调用您的方法“startBackgroundQueue”吗?在我的拙见中,该块将被执行一次。

以及为什么要使用通知来获取阻止的结果?您可以使用嵌套块,例如:

dispatch_async(backgroundThread, ^(void){
    SDJConnection *connection = [[SDJConnection alloc]init];
    self.dataArray = [connection getVideoData];

    dispatch_async(dispatch_get_main_queue(),^(void){
        [activityIndicator stopAnimating];
        if ([self.dataArray count] >1) {
            self.tableView.separatorColor = [UIColor darkGrayColor];
            [self.tableView reloadData];}                
    });
});

这样可以为您节省完整的通知;)

于 2012-04-19T10:40:03.680 回答