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++;
}

}

私は貴重なデータでいっぱいの配列を準備したcaricaItemメソッドで、uilabelsの作成をディスパッチから外しましたが、同じ遅延...そしてcaricaItemでUITableViewを使用する場合も同じです...

どのように進めるのが正しいですか?

ありがとう

4

0 に答える 0