dispatch_async中的子视图在长时间延迟后出现

时间:2012-11-30 09:56:59

标签: ios delay subviews dispatch-async

我已经使用dispatch_async在后台放入一个xml文档的解析,我把信息放在一个数组中,并且,对于一个for循环,我会将每个元素的内容分配给UILabel(现在),问题是在输出控制台中我可以看到每个元素的正确内容,但是uilabel只是在经过长时间的延迟之后才被添加。

代码:

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

dispatch_async(kBgQueue, ^{
    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfURL:url];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
    NSArray *areaCortina = [doc nodesForXPath:@"query" error:nil];

    int i=0;
    for (GDataXMLElement *element in areaCortina) {
        NSLog(@"%@",[[element attributeForName:@"LiftName"] stringValue]); //data are shown correctly 

        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, (30+10)*i, 200, 30)];// don't appear after log
        [label setText:[[element attributeForName:@"name"] stringValue]];
        [self.view performSelectorOnMainThread:@selector(addSubview:) withObject:label waitUntilDone:YES];

        i++;
  }

正如您所看到的,我已经使用了performSelectorOnMainThread但是没有使用,标签不会一次出现,而是在块结束后的10或15秒后正确显示。

想法?

提前致谢

确定编辑1

感谢Shimanski Artem的建议,我现在有以下几点:

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

...    

dispatch_async(kBgQueue, ^{
    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfURL:url];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
    NSArray *areaCortina = [doc nodesForXPath:@"query" error:nil];
    self.data = [[NSMutableArray alloc] init];  

    for (GDataXMLElement *element in areaCortina) {
        [self.data addObject:[[element attributeForName:@"name"] stringValue]]; 

    }
    [[NSNotificationCenter defaultCenter] postNotificationName:@"name" object:self];
 }

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(caricaItem) name:@"name" object:nil];

 ...

} //end method


-(void) caricaItem
{
int i=0;
for (NSString * string in self.dati) {

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, (30+10)*i, 200, 30)];
    [label setText:string];

    [self.view addSubview:label];

    i++;
}

}

我把uilabels的创建放在了调度之外,在caricaItem方法中,我已经准备好了一个充满宝贵数据的数组,但是同样的延迟......如果在caricaItem中我使用的是UITableView ......

什么是正确的方法?

由于

0 个答案:

没有答案