【问题标题】:App hangs when property is included in block当属性包含在块中时应用程序挂起
【发布时间】:2013-01-13 03:31:32
【问题描述】:

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

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

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

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

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

我发现的唯一解决方法是将我的 -refreshDataSource 呼叫改为 -viewDidAppear:。但这让我很恼火,为什么会发生这种情况,也让我感到不安,这里一定有什么地方有问题。

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

【问题讨论】:

  • 我在您的@property 声明中没有看到retain dataArray
  • @s.bandara 在 ARC 中,strong 是对象属性的默认值
  • 没错,我应该提到我的项目是使用 ARC。

标签: ios objective-c-blocks


【解决方案1】:

您的问题并没有解释一切,但这里有一些想法可能会对您有所帮助。

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

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

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

【讨论】:

  • 谢谢罗文。该数组似乎及时初始化。为了更详细地了解视图外观,VC 被推送到我的导航堆栈中。我弹出 VC 并再次推送它,这就是我的应用程序挂起的时候。每次我将 VC 推入堆栈时,-viewDidLoad 都会被调用(如预期的那样)。
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多