0

在 IOS5.1 应用程序中使用 CorePlot-Cocoa Touch。由于散点图、dataForPlots、图例等的设置需要时间,因此决定包含一个 UIActivityIndi​​catorView 以指示用户正在发生某些事情。

- (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 个线程,但这会导致其他问题。

现在在使用这个 UIActivityIndi​​catorView 之前,上面的 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 执行 UIActivityIndi​​catorView?

帮助表示赞赏。

4

1 回答 1

0

在完成之前不要设置数据源-DoMakeupPlot。这样,绘图就不会尝试从尚未准备好的数据源加载数据。

于 2012-05-11T20:37:24.867 回答