我熟悉委托模式并取消委托,特别是在执行异步调用时,当视图控制器消失时,异步调用仍在进行中。我将委托设为nil,然后回调成功返回nil对象。

我现在正在尝试使用完成块使我的代码更易于阅读。

我从我的视图控制器调用网络服务,并传递一个更新UITableView的块。在正常情况下,它可以正常工作。但是,如果我在视图完成之前离开视图,则会执行完成处理程序块-但UITableView现在是僵尸。

处理此问题的常用模式是什么?

使用代码示例进行更新

这是一个iPad应用程序,我一次在屏幕上有两个视图控制器,就像一个拆分视图。一个是细节,另一个是图像网格。我单击图像,它告诉详细信息以加载信息。但是,如果我单击图像的速度太快,它们才有机会进行网络呼叫-我有问题。在更改图像时,将调用以下代码,该代码计算图像的收藏夹...。

所以这是我的难题,如果我使用下面的代码,它可以正常工作,但是如果您在网络响应之前切换图像,它将泄漏在仪器中。

如果我删除__block并自我传递,则它会因僵尸而崩溃。

我赢不了...我确定我缺少有关使用积木的基本知识。

__block UITableView *theTable = [self.table retain];
__block IndexedDictionary *tableData = [self.descriptionKeyValues retain];
FavouritesController *favourites = [Container controllerWithClass:FavouritesController.class];
[favourites countFavouritesForPhoto:self.photo
                         completion:^(int favesCount) {

                             [tableData insertObject:[NSString stringWithFormat:@"%i", favesCount]
                                              forKey:@"Favourites:" atIndex:1];
                             [theTable reloadData];

                             [tableData release];
                             [theTable release];
                         }];

有小费吗?谢谢

第二更新

我更改了加载收藏夹的方式。我没有在单张照片​​上添加收藏夹,而是在每次照片更改上创建一个实例。通过替换此代码并杀死旧的代码-该块无处可回调(我想它甚至不存在),并且我的代码现在如下所示,并且似乎可以正常工作:
[self.favourites countFavouritesForPhoto:self.photo
                         completion:^(int favesCount) {
                             [self.descriptionKeyValues insertObject:[NSString stringWithFormat:@"%i", favesCount]
                                              forKey:@"Favourites:" atIndex:1];
                             [self.table reloadData];
                         }];

它不会泄漏,也不会崩溃。

最佳答案

我建议您测试在块的开头,tableview是否不为零。听起来当其父视图离开屏幕时,该表视图已被正确丢弃,因此在那之后,没有任何表视图操作有效。

将UITableView保留在块中是一个坏主意,因为数据源/表视图的更新可能会导致隐式方法调用和通知,如果未在屏幕上显示表视图,则它们将不相关。

07-26 09:30
查看更多