0

我的可可应用需要从网络获取数据,然后在表格视图中显示内容。所以我NSProgressIndicator在数据下载时添加了一种旋转样式来制作动画。之后动画NSProgressIndicator停止并重新加载NSTableView. 奇怪的是表格视图重新加载后,显示的内容没有更新。然后如果你滚动表格视图,内容开始显示,就像:( 在此处输入图像描述 上面的小矩形是框架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。

谢谢!

4

1 回答 1

0

它是由多线程引起的。

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

最后,我保持- (void)loadOperationData在主线程中被调用,并将其置于- (void)_showIndicator块外。然后它是固定的。

于 2012-09-13T09:31:36.727 回答