gpt4 book ai didi

objective-c - 后台线程中可取消的加载

转载 作者:行者123 更新时间:2023-12-03 16:33:08 25 4
gpt4 key购买 nike

我有一个窗口,在 NSTableView 中显示一些数据。该数据在后台加载。数据加载线程在 windowDidLoad: 方法中启动。如果在加载完成之前关闭窗口,则应取消后台线程。我通过在 windowWillClose: 委托(delegate)方法中向线程发出信号并等待后台线程完成来完成此操作。

现在一切都很完美。但我有一个问题:如何更新 TableView 中的数据?我尝试通过 performSelectorOnMainThread: 调用 reloadData 但这会导致竞争条件:reloadData 调用有时会在窗口之后在主线程上排队close 命令,将在窗口关闭后执行,一切都会燃烧起来。

控制后台线程并与之通信的最佳方式是什么?

最佳答案

嗯,你知道,这正是线程的使用变得复杂的原因:你总是面临同步问题。

我的建议是,不要打电话 [tableView reloadData]从您的线程中,只需向您的 Controller 发出信号(通过调用方法 controllerShouldReloadTable )并让您的 Controller 检查是否 windowWillClose是否已被调用。您的 Controller 可能在 controllerShouldReloadTable 时也已发布。 ,要解决这个问题,您肯定需要 retain来自辅助线程的 Controller 。

顺便说一句,我会取消 viewDidUnload 中的线程(为了对称)。

最重要的是:我将使用异步调用和委托(delegate)类,以便从根本上解决整个多线程问题。

编辑:异步发送请求不会阻塞等待响应的发送线程。相反,异步发送(对于 NSURLConnection 称为 start )立即返回(因此,不会阻塞),并且当收到响应时,将调用委托(delegate)方法(即 connectionDidFinishLoading: ),以便您可以更新模型和用户界面。看看 NSURLConnection 文档,但像往常一样,我强烈建议使用 [ASIHTTPRequest][2] ,其中有 many advantages .

关于objective-c - 后台线程中可取消的加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6143685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com