如何在 UITableVIewCell 中进行 API 调用

Posted

技术标签:

【中文标题】如何在 UITableVIewCell 中进行 API 调用【英文标题】:How to make API call in UITableVIewCell 【发布时间】:2015-10-25 16:51:25 【问题描述】:

我有一个场景,我必须发出 API 请求来更新 UILables 中的 TableViewCell

问题在于,对于每个单元格,我必须发出唯一的API 请求。 API url 相同,但参数不同。

目前我正在调用cellForRowAtIndex,在成功块中我使用dispatch_async 更新数组并重新加载UITableView

我的cellForRowAtIndexMethod

if(!apiResponded)  //Bool value to check API hasn't responded I have to make API request
     
    cell.authorLabel.text = @"-------";// Set Nil

        NSString *userId =[CacheHandler getUserId];

        [self.handleAPI getAuthorList:userId]; //make API Call

    
    else
    
     cell.authorLabel.text = [authorArray objectAtIndex:indexPath.row];// authorArray is global Array
    

我的 API 请求成功块:

numOfCallsMade = numOfCallsMade+1;  //To track how manny calls made
apiResponded = YES;  // to check API is reponded and I have to update the UILables

dispatch_async(kBgQueue, ^

    if(!authorArray)
        authorArray = [[NSMutableArray alloc]init];

    NSArray *obj = [responseData valueForKey:@"aName"];
    if(obj == nil)
    
        [authorArray addObject:@"N/A"];
    

    else
    
        [authorArray addObject:[obj valueForKey:@"authorName"]];


    

           dispatch_async(dispatch_get_main_queue(), ^

                if(numOfCallsMade == [self.mCarsArray count]) // this is to check if I have 10 rows the 10 API request is made then only update
                [self.mTableView reloadData];
                               );


);

当我运行此代码时,我会为每个标签获得相同的值。我不知道我的方法好不好。请任何人建议如何实现这一目标。

【问题讨论】:

【参考方案1】:

根据您的代码,我不确定您想要实现什么。我所知道的是你想为每个单元格发出一个请求,并显示接收到的数据。现在我不知道你想如何存储你的数据,或者你是如何设置的,但我会给你一个简单的建议,告诉你如何设置,然后你可以根据需要进行修改。

我假设您只需为每个单元格发出一次此请求。为简单起见,我们因此可以为接收到的数据(作者姓名?)存储一个字典。

@property (nonatomic, strong) NSMutableDictionary *authorNames;

我们需要在使用前、在 init 或 ViewDidLoad 内或任何您认为合适的地方实例化它(只要它在 TableView 调用 cellForRowAtIndexPath: 之前)。

authorNames = [[NSMutableDictionary alloc] init];

现在在 cellForRowAtIndexPath 中,您可以执行以下操作:

NSInteger index = indexPath.row

cell.authorLabel.text = nil;
cell.tag = index

NSString *authorName = authorNames[@(index)]; 

if (authorName)  // Check if name has already exists
    cell.authorLabel.text = authorName;
 else  
    // Make request here

在您的请求完成块中(在 CellForRowAtIndexPath: 内),添加以下内容:

NSString *authorName = [responseData valueForKey:@“aName”];

authorNames[@(index)] = authorName; // Set the name for that index

if (cell.index == index)  // If the cell is still being used for the same index
    cell.authorLabel.text = authorName;

当您在 TableView 中上下滚动时,它将重用滚动到屏幕外的单元格。这意味着当请求完成时,单元格可能会被滚动到屏幕外并重新用于另一个索引。因此,您要设置单元格标记,并在请求完成后检查单元格是否仍在用于您发出请求的索引。

潜在问题:快速上下滚动时,当您的请求仍在加载时,它可能会为每个单元格发出多个请求。您必须添加一些方法来使每个请求只发出一次。

【讨论】:

thanx @mbo42 我按照您的步骤进行操作,在更改了一些步骤后,我终于实现了这一点:) 很高兴为您服务:)【参考方案2】:

您可以在自定义单元格中声明一个方法,然后从 cellForRowAtIndex 调用它,该方法将调用 API 并更新仅存在于该单元格中的标签。 因此,对于每个单元格,您将有单独的方法调用,并且每个成功块将仅更新特定的单元格标签文本。

【讨论】:

以上是关于如何在 UITableVIewCell 中进行 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在通过 UITableViewCell 中的 XIB 加载的子视图中对标签和 UILabels/UIImageViews 进行初始样式设置

如何在iOS 7上的UITableViewCell左侧获得复选标记,就像在设置中一样?

如何让 UITableViewCell 中的 imageView 大小固定

UITableViewCell 动态高度

如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?

iOS UITableViewCell点击时子视图背景透明的解决方法