当块中包含属性时,应用程序挂起

时间:2013-01-13 03:31:32

标签: ios objective-c-blocks

我有一个UIViewController,它显示从在线数据库中提取的数据表。我有一个单身经理来处理这些数据的提取提供表所需的数据。

这是经理如何运作的一个例子:

@property (nonatomic) NSArray *dataArray;
...
- (void)refreshDataSource
{
    [AClass fetchInBackgroundWithCompletionHandler:^(NSArray *objects) {
        self.dataArray = [NSArray arrayWithArray:objects];
    }
}
...
- (NSArray *)tableViewDataSource
{
    return self.dataArray;
}

视图控制器通过调用-refreshDataSource中的-viewDidLoad来请求更新,但同时通过指向-tableViewDataSource为其UITableView提供来自管理器的缓存数据。

当视图控制器第一次出现时,一切都很好。我第二次出现相同的视图控制器,应用程序挂起。网络请求也不会触发。

我发现的唯一解决方法是将-refreshDataSource电话转移到-viewDidAppear:。但它让我觉得为什么会发生这种情况并让我感到不安,因为这里肯定是错误的。

如果有人能提供任何帮助或建议,那就太棒了!

1 个答案:

答案 0 :(得分:0)

你的问题没有解释所有问题,但这里有一些可能对你有用的想法。

1)viewDidLoad仅在您的视图第一次加载时调用。如果切换到另一个视图,然后返回到tableView,则不会调用refreshDataSource。

2)viewDidLoad可能在分配和初始化数组之前触发,所以当你刷新数据时它是nil,而viewDidAppear可能没有同样的问题。

如果没有更多信息,我无法给出更具体的答案。你能解释一下“第一次,一切都很好。我第二次去......”更清楚?如果可能的话,一步一步地做。