菜鸟教程小白 发表于 2022-12-13 11:35:48

ios - 如何在 UITableVIewCell 中进行 API 调用


                                            <p><p>我有一个场景,我必须发出 API 请求来更新 <code>TableViewCell</code> 中的 <code>UILables</code> 。 </p>

<p>问题是我必须为每个单元格发出唯一的 <code>API</code> 请求。 <code>API</code> url 相同,但参数不同。</p>

<p>目前我正在 <code>cellForRowAtIndex</code> 中进行调用,在成功 block 中我正在使用 <code>dispatch_async</code> 更新数组并重新加载 <code>UITableView</code>。</code> p>

<p>我的 <code>cellForRowAtIndexMethod</code> :</p>

<pre><code>if(!apiResponded)//Bool value to check API hasn&#39;t responded I have to make API request
    {
    cell.authorLabel.text = @&#34;-------&#34;;// Set Nil

      NSString *userId =;

      ; //make API Call

    }
    else
    {
   cell.authorLabel.text = ;// authorArray is global Array
    }
</code></pre>

<p>我的 API 请求成功 block :</p>

<pre><code>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 = [init];

    NSArray *obj = ;
    if(obj == nil)
    {
      ;
    }

    else
    {
      ];


    }

         dispatch_async(dispatch_get_main_queue(), ^{

                if(numOfCallsMade == ) // this is to check if I have 10 rows the 10 API request is made then only update
                ;
                               });


});
</code></pre>

<p>当我运行此代码时,我会为每个标签获得相同的值。我不知道我的方法好不好。请任何人建议如何实现这一目标。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>根据您的代码,我不确定您想要实现什么。我所知道的是你想为每个单元格发出一个请求,并显示接收到的数据。现在我不知道你想如何存储你的数据,或者你是如何设置的,但我会给你一个简单的建议,告诉你如何设置,然后你可以根据需要进行修改。</p>

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

<pre><code>@property (nonatomic, strong) NSMutableDictionary *authorNames;
</code></pre>

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

<pre><code>authorNames = [ init];
</code></pre>

<p>现在在 cellForRowAtIndexPath 中,您可以执行以下操作:</p>

<pre><code>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
}
</code></pre>

<p>在您的请求完成 block 中(在 CellForRowAtIndexPath: 内),添加以下内容:</p>

<pre><code>NSString *authorName = ;

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;
}
</code></pre>

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

<p>潜在问题:快速上下滚动时,当您的请求仍在加载时,它可能会为每个单元格发出多个请求。您必须添加一些方法来使每个请求只发出一次。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在 UITableVIewCell 中进行 API 调用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/33332308/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/33332308/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在 UITableVIewCell 中进行 API 调用