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

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

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使用的数组。 当用户点击上面运行代码的界面按钮时,我的应用程序崩溃了。 据我所知,当主线程中的app绘制图时, calculateViewData会在另一个线程中更改数组。 结果,我总是在drawRect中崩溃这个错误[__NSArrayI objectAtIndex:]

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

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

根据您之前的问题,您正在使用Core Data,因此我建议您阅读Core Data中的Concurrency 。

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

您可能不必在工作线程中调用setNeedsDisplay。 使用display和setNeedsDisplay检查刷新视图不起作用

希望这能解决您的问题。