2

Webサービスからデータをロードするメソッドがあります。そのメソッドの開始時に、UIActivityIndi​​catorを表示するのが好きです。

ただし、非表示をNOに変更するだけでは、UIViewは再描画されません。したがって、UIActivityIndi​​catorは、データの長いロードの後に​​表示されますが、これは間違いなく遅れています。

では、データのロードが始まる前に、UIViewにactivityIndi​​catorを再描画するように指示するにはどうすればよいですか?

- (IBAction)loadData{
    [activity setHidden:NO];
     // here the activtyIndicator should appear 
     ...
    loadlongdataFromNet..
    [activity setHidden:YES];
     // here the activtyIndicator should disappear 

}

4

2 に答える 2

4

メインスレッドでネットワークやその他の計算量の多い操作を実行しないでください!!!

UIをフリーズ/ブロックします。長いネットワーク関連の処理をバックグラウンドスレッドに移動する必要があります。

- (void)loadData
{
    [activity startAnimating]; // use this instead of setHidden
    [NSThread detachNewThreadSelector:@selector(reallyLoadData) toTarget:self withObject:nil];
}

- (void)reallyLoadData
{
    // network-heavy processing
    // then:
    [activity performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
}
于 2012-10-29T15:09:15.590 に答える
0

1つのアプローチは、GCDを使用してこれを適切に行うことです。

- (void)loadData {
    [activity startAnimating];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // do long running data load here

        dispatch_async(dispatch_get_main_queue(), ^{
            [activity stopAnimating];
        });
    });
}
于 2012-10-29T15:14:25.253 に答える