使用UIActivityIndi​​catorView和CorePlot-Cocoa Touch会导致内存问题

时间:2012-05-11 03:48:07

标签: ios5 core-plot uiactivityindicatorview

在IOS5.1应用程序中使用CorePlot-Cocoa Touch。由于散点图,dataForPlots,legends等的设置需要时间,因此决定使用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个Threads调用了绘图数据源例程:

  

- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)情节

     

- (NSNumber *)numberForPlot:(CPTPlot *)绘图字段:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index

有时会导致内存问题并且应用程序崩溃。

实验从上述两个例程中退出这两个线程,但这会导致其他问题。

现在在使用这个UIActivityIndi​​catorView之前,从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时删除执行数字运算的线程?

帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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