在IOS5.1应用程序中使用CorePlot-Cocoa Touch。由于散点图,dataForPlots,legends等的设置需要时间,因此决定使用UIActivityIndicatorView来指示用户正在发生的事情。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
progressInd = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
progressInd.center = self.view.center;
[progressInd sizeToFit];
progressInd.hidden = NO;
progressInd.alpha = 1.0;
[self.view addSubview:progressInd];
[progressInd startAnimating];
[self.view bringSubviewToFront:progressInd];
[self performSelectorInBackground:@selector(DoMakeupPlot) withObject:nil];
}
- (void)DoMakeupPlot
{
… set up plot
… including datasource and delegate
[progressInd stopAnimating];
[progressInd removeFromSuperview];
progressInd = nil;
}
现在这似乎有时会起作用,但很明显有2个Threads调用了绘图数据源例程:
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)情节
- (NSNumber *)numberForPlot:(CPTPlot *)绘图字段:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
有时会导致内存问题并且应用程序崩溃。
实验从上述两个例程中退出这两个线程,但这会导致其他问题。
现在在使用这个UIActivityIndicatorView之前,从MainThread调用上面的两个例程,一切都很好。
还尝试使用MBProgressHud,显然也有同样的问题。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
HUD = [[MBProgressHUD alloc] initWithView:self.view];
[self.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Loading";
HUD.detailsLabelText = @"plot data";
HUD.square = YES;
[HUD showWhileExecuting:@selector(DoMakeupPlot) onTarget:self withObject:nil animated:YES];
}
在完成设置后,如何在MainThread执行UIActivityIndicatorView时删除执行数字运算的线程?
帮助表示赞赏。
答案 0 :(得分:0)
在-DoMakeupPlot
完成之前,请勿设置数据源。这样,该图不会尝试从尚未准备好的数据源加载数据。