NSOperation 在后台完成,尝试通知主线程,视图不再存在。碰撞

发布于 2024-11-08 01:13:39 字数 399 浏览 6 评论 0原文

我有一个 NSOperation 不在主线程中运行。它是从 UITableViewController 生成的。操作完成后,我想重新加载表视图,因为某些数据已更改。我已经为后台设置了一个委托,以在完成时通知。完成后,我使用 PerformSelectorOnMainThread 在主线程上专门调用 reloadData 的包装器。

在大多数情况下,这工作得很好,但是,原始 (edit)tableViewController (/edit) 被释放并且我收到僵尸调用的可能性非零。

所以问题分为两部分:

  1. 是否可以在不保留对象的情况下从后台线程获得委托?
  2. 这只是一个糟糕的设计吗?我应该改用 NSNotifications 吗?在这种情况下,这是首选的通知方法吗?

提前致谢。

I have an NSOperation running not in the main thread. It is spawned from a UITableViewController. When the operation is complete, I'd like to reload the tableview since some data has changed. I've set a delegate for the background to notify on completion. When done, I call a wrapper around reloadData specifically on the main thread using performSelectorOnMainThread.

For the most part, this works well, however, there is a non-0 chance that the original (edit)tableViewController (/edit) gets released and I get zombie calls.

So the question is in 2 parts:

  1. Is it possible to have a delegate from the background thread without retaining the object?
  2. Is this just a bad design? Should I be using NSNotifications instead? Would that be the preferred method of notifying in this case?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浊酒尽余欢 2024-11-15 01:13:39

如果在调用委托上的任何操作之前有可能释放委托,则应保留该委托。您可以在 tableViewController 中设置一个状态来处理调用委托回调并且不使用 tableViewController 的情况(基本上使回调充当无操作)。操作完成后,只需释放委托对象即可。

这不是一个糟糕的设计,但你只需要处理这些条件。

A delegate should be retained if there is a possibility that it might be released before any operation on the delegate is invoked. You can set up a state in tableViewController to handle the case when the delegate callback is invoked and the tableViewController is not to be used (Basically make the callbacks act as no-op). Once your operation is done, just release the delegate object.

It is not a bad design but you just need to handle these conditions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文