2013-01-13 36 views
0

我有一个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:。但它让我痒痒,为什么会发生这种情况,并且让我感到不适,因为这里的某些事情一定是错的。

如果任何人可以提供任何帮助或建议,将是伟大的!

+2

我在'dataArray'的'@ property'声明中看不到'retain'。 –

+1

@ s.bandara在ARC中,strong是对象属性的默认值 – MaxGabriel

+0

没错,我应该提到我的项目正在使用ARC。 – Ricky

回答

0

你的问题并没有解释所有的事情,但这里有几个想法可以帮助你。

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

2)viewDidLoad可能在数组被分配和初始化之前触发,因此在刷新数据时它是零,而viewDidAppear可能没有相同的问题。

没有更多的信息,我不能给出更具体的答案。你能否更清楚地解释“第一次,一切都很好,第二次我去......”如果可能,请逐步执行您的操作。

+0

谢谢罗恩。该阵列似乎在及时初始化。为了更详细地了解视图外观,将VC推入我的导航堆栈。我弹出VC并再次推送它,这是当我的应用程序挂起时。每次我将VC推入堆栈时,都会调用“-viewDidLoad”(如预期的那样)。 – Ricky

相关问题