通常,如果我重新加载表,它不会崩溃。但是当我在后台获取一些数据然后重新加载表来显示该数据时,如果用户正在滚动表,那么应用程序崩溃。原因是对象数组chatData
为空。我不知道它是如何空洞的。因为在重新加载表之前我将对象设置为chatData
。请注意,仅当用户同时滚动时才会崩溃。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Here app crashes when chatData is empty. Don't get why it is ever empty, because reloadData is called only after setting objects.
if ([user.userId isEqualToString:[[chatData objectAtIndex:row] objectForKey:SET_SENDER]])
{
}
}
- (void)refreshTable
{
.
.
.
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
self.chatData = [objects mutableCopy];
[chatTable reloadData];
}
}
答案 0 :(得分:3)
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
self.chatData = [objects mutableCopy];
[chatTable reloadData];
}];
我认为这是在后台线程上进行的吗?
如果是这样,你应该使用dispatch_async
将chatData和reloadData调用的分配移动到主线程,就像任何UI调用一样,UI接触的任何数据都应该在主线程上完成并分配。
像这样:
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
dispatch_async(dispatch_get_main_queue(), ^{
self.chatData = [objects mutableCopy];
[chatTable reloadData];
});
}];
答案 1 :(得分:0)
问题是我在代码中的某处清空了chatData
,之后如果重新加载表,那么[chatData objectAtIndex:row]
会导致应用程序崩溃。