私は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++;
}
}
私は貴重なデータでいっぱいの配列を準備したcaricaItemメソッドで、uilabelsの作成をディスパッチから外しましたが、同じ遅延...そしてcaricaItemでUITableViewを使用する場合も同じです...
どのように進めるのが正しいですか?
ありがとう