计算数据时会崩溃并在不同的线程中绘制数据。

时间:2011-08-16 18:22:43

标签: iphone ios

当用一些情节绘制视图时,我的应用程序经常崩溃。为了在计算绘图数据时保持界面响应,我使用线程。

dispatch_async(dispatch_get_main_queue(), ^{
    [activity startAnimating];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
     //  do a lot of calculation   
        [GraphView calculateViewData];
        dispatch_async(dispatch_get_main_queue(), ^{
           //  draw plot 
           [GraphView setNeedsDisplay];    
           [activity stopAnimating];
        });
    });
});
calculateViewData中的

我填写了一些稍后将在drawRect中使用的数组。当用户点击上面运行代码的界面按钮时,我的应用程序崩溃了。据我所知,主线程calculateViewData中的app绘制图改变了另一个线程中的数组。因此,我总是在drawRect

中出现此错误[__NSArrayI objectAtIndex:]

我该怎么做才能修复它?复制对象在这种情况下可以提供帮助吗?

2 个答案:

答案 0 :(得分:0)

您无法在一个线程上操作数据,然后尝试在另一个线程上使用该更改数据。相反,您在后台线程上执行所有操作,然后在操作完成时通知最前面/主线程。

根据您之前的问题,您使用的是核心数据,因此我建议您阅读Concurrency in Core Data

后台处理让UI保持响应,但这并不意味着您实际上一次做两件事。无论处理发生在哪个线程,您都必须在使用数据之前完成数据处理。

答案 1 :(得分:-1)

您可能不必在工作线程中调用setNeedsDisplay。查看Refresh view with display and setNeedsDisplay not working

希望这可以解决您的问题。