重新加载表视图数据,使现有数据可见

时间:2013-08-06 08:03:12

标签: objective-c json uitableview afnetworking uirefreshcontrol

我正在使用通过AFNetworking获取和解析JSON的标准方法,然后使用数据填充表格视图。

NSURL *url = [NSURL URLWithString:serverURL];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation
                                     JSONRequestOperationWithRequest:request
                                     success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json) {
                                         [refresh endRefreshing];
                                         self.results = [json valueForKeyPath:@"data"];
                                         [self.tableView reloadData];
                                     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
                                         [refresh endRefreshing];
                                     }];
[self.tableView reloadData];
[operation start];

就是这样,每次用户拉动刷新整个表视图时,消息将被加载并且新数据被加载,然后在一秒左右后呈现给用户。但是我希望表中的数据保持不变,直到新数据可用并加载为止。所以我评论了[self.tableView reloadData];思考它会使它工作,虽然可见但在最初的几秒钟内,但应用程序很快崩溃了。出现错误:

  

由于未捕获的异常'NSRangeException'而终止应用程序,原因:   ' * - [__ NSArrayI objectAtIndex:]:索引1超出范围的空   阵'

现在我甚至不完全确定这是正确的方法,所以基本上,我的问题是如何在加载新数据之前将数据保存在表视图中,或者将现有数据推送到表视图,有点像Facebook和Twitter应用程序在刷新新闻提要/时间线时所做的。

更新

我试过这个方法:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.results count] inSection:0];
NSArray *indexArray = [NSArray arrayWithObjects:indexPath, nil];
[self.tableView insertRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationAutomatic];

但是我收到以下错误:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'尝试插入第15行   进入第0节,但在第0节后只有15行   更新

1 个答案:

答案 0 :(得分:0)

在您的成功阻止中,您必须首先检查您是否获得了数据。如果有任何数据,则使用新数据重新加载tableview,否则不应尝试更改现有数据。试试这个。

  NSArray *tempResults = [json valueForKeyPath:@"data"];
  if(tempResults && [tempResults count] > 0)
  {                                             
      self.results = tempResults;                                        
  }                                        
  [self.tableView reloadData];

在tempResults上保留一个断点,看看你得到了什么数据。