サブクラス化された UICollectionViewCells で構成される UICollectionView があります。
これらのセルには、API に対して非同期要求を行うボタンがあります。あるケースでは、「ハート」ボタンがあります。これをタップすると、ボタンが無効になり、非同期で API 呼び出しが行われ、コールバックとして使用するブロックが渡されます。呼び出しが成功すると、ボタンは別の状態に更新されます。
問題は、ブロックからのコードが呼び出されると、セルへの参照が失われたり変更されたりするように見えることです。そのため、セルが画面外にスクロールすると、ボタンの状態が更新されず、そのセルが再利用されるたびにボタンが無効のままになるなど、悪いことが起こります。
ここでのベストプラクティスは何ですか?
- (void)didTapHeart:(id)sender event:(id)event {
NSSet *touches = [event allTouches];
UITouch *touch = [touches anyObject];
CGPoint currentTouchPosition = [touch locationInView:self.collectionView];
NSIndexPath *indexPath = [self.collectionView indexPathForItemAtPoint:currentTouchPosition];
__block MyObject *object = [myObjects objectAtIndex:indexPath.row];
__block CollectionViewCell *cell = (CollectionViewCell *)[sender superview];
cell.btnHeart.enabled = NO;
[[ApiSingleton defaultApi] like:object success:^{
dispatch_async(dispatch_get_main_queue(), ^{
cell.btnHeart.enabled = YES;
object.isLiked = YES;
object.likeCount++;
[cell setLiked:YES];
});
} failure:^(NSDictionary *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[cell setLiked:NO];
cell.btnHeart.enabled = YES;
object.isLiked = NO;
});
}];
}