cocoa:在NSProgressIndicator动画后刷新NSTableview

时间:2012-09-11 14:06:09

标签: cocoa nstableview nsprogressindicator

我的cocoa app需要从网络中获取数据,然后在表格视图中显示内容。所以我在下载数据时添加一个NSProgressIndicator的旋转样式来设置动画。之后,NSProgressIndicator的动画停止并重新加载NSTableView。奇怪的是在表视图重新加载后,显示的内容不会更新。然后如果滚动表格视图,内容就会开始显示,就像: enter image description here (上面的小矩形是NSProgressIndicator

的框架

以下是我的代码:


- (void)loadOperationData
{   
    dispatch_async(dispatch_get_main_queue(), ^{
        [self _showIndicator];
    });

    [NSThread detachNewThreadSelector:@selector(getOperationLogProcess) toTarget:self withObject:nil];
}

- (void)_showIndicator
{
    if (indicator == nil) 
    {
        indicator = [[NSProgressIndicator alloc] init];
        [indicator setStyle:NSProgressIndicatorSpinningStyle];
        [indicator setUsesThreadedAnimation:NO];// I tried to comment this, but no use
        int width = 30;
        CGRect rect = CGRectMake(0, 0, width, width);
        NSRect selfRect = [_coverView frame];
        rect.origin.x = selfRect.size.width/2 - width/2;
        rect.origin.y = selfRect.size.height/2 - width/2;
        indicator.frame = rect;
        [_coverView addSubview:indicator];
    }

    [indicator setHidden:NO];
    [indicator startAnimation:self];
}

-(void)getOperationLogProcess{

    NSDictionary *tempResutDic = [WebServiceManager getOperationLog];//using synchronous ASIHttpRequest to download data
    if ([[tempResutDic objectForKey:@"resultCode"] intValue]==100) {
        self.operationLogArray = [tempResutDic objectForKey:@"items"];

        [self performSelectorOnMainThread:@selector(reloadTableview) withObject:nil waitUntilDone:YES];//refresh UI in main thread
    }
}

-(void)reloadTableview
{
    [indicator stopAnimation:self];
    [indicator setHidden:YES];
    [operationlogTable setEnabled:YES];

    if ([_coverView isHidden])
    {
        return;
    }

    self.lastUpdateDate = [NSDate date];

    [operationlogTable reloadData];
}

鼠标点击事件调用 -(void)loadOperationData。我将 -(void)_showIndicator放入调度块的原因是指标无法显示。我尝试了很多,最后选择了它。

我认为这个问题与显示指标的方式密切相关,因为如果我评论指标的代码,问题就会被驳回。

我真的需要指示器让用户知道他们正在等待。所以请帮助我如何正确使用NSProgressIndicator。

谢谢!

1 个答案:

答案 0 :(得分:0)

由多线程引起的。

- (void)loadOperationData中,我使用主块来显示进度指示器并创建一个线程来在后台获取数据。该块以异步方式运行,有时在-(void)reloadTableview之后。

最后,我在主线程中调用- (void)loadOperationData并将- (void)_showIndicator放在块之外。然后就修好了。