0

我已经使用 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......

正确的方法是什么?

谢谢

4

0 回答 0