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

一种方法是使用 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 回答