当用一些情节绘制视图时,我的应用程序经常崩溃。为了在计算绘图数据时保持界面响应,我使用线程。
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:]
我该怎么做才能修复它?复制对象在这种情况下可以提供帮助吗?
答案 0 :(得分:0)
您无法在一个线程上操作数据,然后尝试在另一个线程上使用该更改数据。相反,您在后台线程上执行所有操作,然后在操作完成时通知最前面/主线程。
根据您之前的问题,您使用的是核心数据,因此我建议您阅读Concurrency in Core Data。
后台处理让UI保持响应,但这并不意味着您实际上一次做两件事。无论处理发生在哪个线程,您都必须在使用数据之前完成数据处理。
答案 1 :(得分:-1)
您可能不必在工作线程中调用setNeedsDisplay。查看Refresh view with display and setNeedsDisplay not working
希望这可以解决您的问题。