2011-05-19 12 views
1

我有一个NSOperation不在主线程中运行。它是从UITableViewController派生的。当操作完成后,我想重新加载tableview,因为有些数据已经改变。我已经为背景设置了一个委托来完成通知。完成后,我使用performSelectorOnMainThread专门在主线程上调用reloadData的包装器。NSOperation在后台完成,试图通知主线程,视图不再存在。崩溃

大部分情况下,这个效果很好,但是,原始(编辑)tableViewController(/编辑)获得释放并获得僵尸呼叫的机会非0。

所以,问题是两个部分:

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

在此先感谢。

+1

真正的问题是:为什么你的表格视图被释放?我有一种感觉,表视图没有妥善保留,这是你的根本问题。 – 2011-05-19 04:10:43

+0

John是对的,如果你需要重新加载它,你不应该释放tableView。 reloadData方法将重置tableView,这就是你想要的。如果你想隐藏它或只是使用tableView.hidden属性。 – 2011-05-19 05:35:10

+0

更正后,如果从导航控制器堆栈弹出,则可以释放tableViewController。数据仍然可能是相关的,但我希望线程完成(并保存它正在处理的数据) – 2011-05-19 18:24:43

回答

1

如果在对代理的任何操作被调用之前有可能释放它,那么应该保留一个委托。您可以在tableViewController中设置一个状态来处理委托回调被调用并且不使用tableViewController的情况(基本上使回调作为非操作)。一旦你的操作完成,只需释放委托对象。

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

+0

有趣。那么,因为通常在响应返回后发生的唯一情况是tableview重新加载,即使它没有显示,我也可以让tableview重新加载,因为委托保留它,它不会消失, t崩溃。我刚刚实现了这一点(通过改变分配以在必要时保留和释放),并且在我们说话时进行测试。 – 2011-05-20 03:52:12