我想为iPhone应用程序运行一个后台线程,该应用程序一直在后台运行,并在特定事件触发时执行,并等待特定事件触发以再次开始执行。在线程执行期间,如果再次触发特定事件,则线程应重新开始其工作。
我正在开发自定义地图应用程序。在TouchesMoved事件中,我需要根据在后台线程中移动的位置加载地图图像切片。问题是当我快速移动地图时触发了touchesMoved事件,前一个线程尚未完成其工作并且启动了新线程。它导致线程安全问题,我的应用程序崩溃了。
因此,我正在考虑一个解决方案,让所有时间都可以使用单个线程并在触发touchesMoved时启动它的工作如果再次触发touchesMoved它应该重新开始工作而不是启动新线程。我认为它会阻止线程安全问题。
请帮忙
答案 0 :(得分:6)
首先,我回应NSOperation
和NSOperationQueue
的使用。你可以直接使用NSThread
,但NSOperation
的重点在于它隐藏了你的线程,让你专注于你需要做的处理。尝试在需要时触发NSOperation
请求,查看用例中的性能;即使这些操作以异步方式获取数据,它也应该为您提供一个性能良好的清洁解决方案,以及未来的证据。
我已经成功地使用NSInvocationOperation根据需要经常发出请求,这听起来像是你要求的那种要求和行为。我会更普遍地建议您在测试项目中进行实验;在这里你可以测试性能。
以下博客帮助我开始使用NSOperation
:
http://www.dribin.org/dave/blog/archives/2009/09/13/snowy_concurrent_operations/
http://www.cimgf.com/2008/02/16/cocoa-tutorial-nsoperation-and-nsoperationqueue/
与往常一样,Apple Threading Programming Guide是一个重要的读物,根据需要找出可行的方法。
答案 1 :(得分:3)
这听起来像是NSOperationQueue的理想工作。读取concurrency guide的操作队列部分。
基本上,您为每个地图图块加载创建一个NSOperation对象,并将它们放在仅allows them to execute one at a time.
的队列上答案 2 :(得分:0)
在后台计算线程中放置一个运行循环。然后使用NSOperation队列来管理向其发送消息。队列和运行循环将为您序列化所有工作请求。