iOS后台队列检索两次数据?

时间:2012-04-15 05:49:54

标签: ios xcode parsing grand-central-dispatch

我正在尝试提高应用程序的响应能力,在检查调试器控制台时,我注意到应用程序似乎在两次检索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];}                
});
}

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

谢谢!

1 个答案:

答案 0 :(得分: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];}                
    });
});

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