0

我正在开发一个应用程序,我必须从 JSON 获取数据并在 UITableView 中显示。正在后台获取数据。但它似乎进入了无限循环。

任何帮助将不胜感激。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier   forIndexPath:indexPath];
queue = dispatch_queue_create("com.events.app", NULL);
dispatch_async(queue, ^{
    [self load];
    //Need to go back to the main thread since this is UI related
    dispatch_async(dispatch_get_main_queue(), ^{
        // store the downloaded image in your model
        Events *evObj = [eventsArray objectAtIndex:[indexPath row]];
        NSLog(@"evObj = %@",evObj);
        cell.textLabel.text = evObj.eName;
        cell.detailTextLabel.text = @"Detailed Text";
        [self.tableView beginUpdates];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]
                              withRowAnimation:UITableViewRowAnimationLeft];
        [self.tableView endUpdates];
    });
});
    // Configure the cell...



return cell;
}
4

3 回答 3

2

它进入循环,因为发送-reloadRowsAtIndexPaths:withRowAnimation:将触发UITableView向您的数据源询问另一个单元格-tableView:cellForRowAtIndexPath:

如果要异步更新单元格,则必须直接更新 UI 元素,但要避免重新加载整个单元格。如果事情没有自动更新,您可以发送-setNeedsDisplay-setNeedsLayout在更新后发送。

于 2013-04-04T12:13:48.023 回答
1

只需删除所有异步调用:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier   forIndexPath:indexPath];

   if(cell == nil) {
     /// load the cell.
   }


    // store the downloaded image in your model
   Events *evObj = [eventsArray objectAtIndex:[indexPath row]];
   NSLog(@"evObj = %@",evObj);
   cell.textLabel.text = evObj.eName;
   cell.detailTextLabel.text = @"Detailed Text";


   return cell;
}

只需将 移至[self load];代码的其他部分,例如viewDidLoad.

于 2013-04-04T12:09:14.587 回答
0

区分数据部分和ui部分。

IE

只需调用[self load];一次方法,或多次调用。最好的地方是 viewDidLoad 方法左右。

重新加载数据并在 uitableview 中显示它们的实现可能如下所示(使用 GCD)

dispatch_queue_t queue = dispatch_queue_create("com.events.app", NULL);

dispatch_async(queue, ^{
[self load];

//Need to go back to the main thread since this is UI related
dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableview reloadData];

//don't forget to release your queue
dispatch_release(queue);

});

});

从 rckoenes复制- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {}方法的实现,你就完成了;)

但请记住一件重要的事情。您的第一个抛出的代码会导致很大的开销,每次调用此方法时,您都在下载、解析和设置数据,在开始时 uitableview 加载自身时至少 3 次,然后每次滚动时,它都会被调用多次您可以在屏幕上看到许多行/单元格

于 2013-04-04T12:21:38.193 回答