如何解决取消加载后台线程
我有一个窗口,以“ 0”显示一些数据。此数据将在后台加载。数据加载线程以“ 1”方法启动。如果在加载完成之前关闭了窗口,则应取消后台线程。我通过在windowWillClose:
委托方法中发信号通知线程并等待后台线程完成来完成此操作。
现在,这一切都完美地工作了。但是我有一个问题:如何更新表视图中的数据?我尝试通过performSelectorOnMainThread:
调用reloadData
,但这会导致争用情况:reloadData
调用有时在窗口关闭命令之后在主线程上排队,并且将在窗口关闭后执行,并且一切都在火焰中进行。
控制和与后台线程通信的最佳方法是什么?
解决方法
嗯,您知道,这正是使线程使用变得复杂的原因:您始终会遇到同步问题。
我建议的是,不要从线程中调用
[tableView reloadData]
,而只需向您的控制器发信号(通过调用方法controllerShouldReloadTable
),然后让您的控制器检查是否已调用windowWillClose
。可能在controllerShouldReloadTable
时控制器也已被释放,要解决此问题,您肯定需要从辅助线程中retain
控制器。
另外,我将取消ѭ11would中的线程(出于对称性)。
最重要的是:我将使用异步调用和委托类,以便从根本上解决整个多线程问题。
编辑:异步发送请求不会阻塞正在等待响应的发送线程。取而代之的是,异步发送(对于NSURLConnection
被称为ѭ13,)立即返回(因此没有阻塞),并且在接收到响应时,将调用一个委托方法(即connectionDidFinishLoading:
),以便您可以更新模型和UI。看一下NSURLConnection
文档,但是我还是一如既往地强烈建议使用[ASIHTTPRequest][2]
,它具有很多优点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。