在 IOS5.1 应用程序中使用 CorePlot-Cocoa Touch。由于散点图、dataForPlots、图例等的设置需要时间,因此决定包含一个 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 个线程调用绘图数据源例程:
-(NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
-(NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
这有时会导致内存问题和应用程序崩溃。
尝试从上述 2 个例程中退出这 2 个线程,但这会导致其他问题。
现在在使用这个 UIActivityIndicatorView 之前,上面的 2 个例程是从 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?
帮助表示赞赏。