如何在 UITableVIewCell 中调用 API
How to make API call in UITableVIewCell
我有一个场景,我必须发出 API 请求来更新 TableViewCell
中的 UILables
。
问题是我必须为每个单元格发出一个 Unique 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];
});
});
当我 运行 这段代码时,我得到每个标签的相同值。我不知道我的方法好不好。请任何人建议如何实现这一目标。
您可以在自定义单元格中声明一个方法,然后从 cellForRowAtIndex 调用它,该方法将调用 API 并更新仅存在于该单元格中的标签。
因此,对于每个单元格,您将有单独的方法调用,每个成功块将仅更新特定的单元格标签文本。
从你的代码来看,我不太确定你想要实现什么。我所知道的是你想为每个单元格发出一个请求,并显示接收到的数据。现在我不知道你想如何存储你的数据,或者你是如何设置的,但我会给你一个简单的建议,告诉你如何设置它,然后你可以根据需要进行修改。
我假设您只需要为每个单元格发出一次此请求。因此,为简单起见,我们可以为接收到的数据(作者姓名?)存储一个字典。
@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 中上下滚动时,它会重用滚动到屏幕外的单元格。这意味着当请求完成时,单元格可能已经滚动到屏幕外并重新用于另一个索引。因此,您想要设置单元格标记,并在请求完成后检查单元格是否仍在用于您发出请求的索引。
潜在问题:快速上下滚动时,当您的请求仍在加载时,它可能会为每个单元格发出多个请求。您必须添加一些方法来只发出一次请求。
我有一个场景,我必须发出 API 请求来更新 TableViewCell
中的 UILables
。
问题是我必须为每个单元格发出一个 Unique 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];
});
});
当我 运行 这段代码时,我得到每个标签的相同值。我不知道我的方法好不好。请任何人建议如何实现这一目标。
您可以在自定义单元格中声明一个方法,然后从 cellForRowAtIndex 调用它,该方法将调用 API 并更新仅存在于该单元格中的标签。 因此,对于每个单元格,您将有单独的方法调用,每个成功块将仅更新特定的单元格标签文本。
从你的代码来看,我不太确定你想要实现什么。我所知道的是你想为每个单元格发出一个请求,并显示接收到的数据。现在我不知道你想如何存储你的数据,或者你是如何设置的,但我会给你一个简单的建议,告诉你如何设置它,然后你可以根据需要进行修改。
我假设您只需要为每个单元格发出一次此请求。因此,为简单起见,我们可以为接收到的数据(作者姓名?)存储一个字典。
@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 中上下滚动时,它会重用滚动到屏幕外的单元格。这意味着当请求完成时,单元格可能已经滚动到屏幕外并重新用于另一个索引。因此,您想要设置单元格标记,并在请求完成后检查单元格是否仍在用于您发出请求的索引。
潜在问题:快速上下滚动时,当您的请求仍在加载时,它可能会为每个单元格发出多个请求。您必须添加一些方法来只发出一次请求。