我的cocoa app需要从网络中获取数据,然后在表格视图中显示内容。所以我在下载数据时添加一个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。
谢谢!
答案 0 :(得分:0)
由多线程引起的。
在- (void)loadOperationData
中,我使用主块来显示进度指示器并创建一个线程来在后台获取数据。该块以异步方式运行,有时在-(void)reloadTableview
之后。
最后,我在主线程中调用- (void)loadOperationData
并将- (void)_showIndicator
放在块之外。然后就修好了。