我已经使用 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......
正确的方法是什么?
谢谢