启动异步请求后,如何保留对UICollectionViewCell的引用?

我有一个包含子类化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;
    });
}];

}

卡尔·维泽

不要保留对单元格的引用-保留对索引路径的引用,并在您关注的索引路径处询问单元格的收集视图,例如:

[[ApiSingleton defaultApi] like:object success:^{
    dispatch_async(dispatch_get_main_queue(), ^{
        CollectionViewCell *blockCell = [self.collectionView cellForItemAtIndexPath:indexPath];
        blockCell.btnHeart.enabled = YES;
        object.isLiked = YES;
        object.likeCount++;
        [blockCell setLiked:YES];
    });

} failure:^(NSDictionary *error) {

    dispatch_async(dispatch_get_main_queue(), ^{
        CollectionViewCell *blockCell = [self.collectionView cellForItemAtIndexPath:indexPath];
        [blockCell setLiked:NO];
        blockCell.btnHeart.enabled = YES;
        object.isLiked = NO;
    });
}];

由于在这种情况下会cellForItemAtIndexPath:返回表示的单元格object,或者nil如果当时在屏幕上不存在该单元格,那么您不仅object要进行更新,而且还要保证在发生回调时更新表示该单元格的单元格,因此您不必不会干扰其他细胞。您看到的问题的根源是集合视图会重复使用单元格,因此在任何给定时间,单元格都可以在完全不同的索引路径上表示数据。

完全无关,但你并不需要做object一个__block变量,因为你永远不改变变量本身的价值。与相同cell,尽管更改之后您仍然不会在代码块中使用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

操作后如何保留对数组的引用?

来自分类Dev

异步请求后如何处理条件

来自分类Dev

SwiftUI中异步请求完成后如何调用函数?

来自分类Dev

重新启动后如何保留我的文件?

来自分类Dev

重新启动后如何保留网络命名空间

来自分类Dev

如何使用VSCode在Firefox中保留扩展名并请求启动

来自分类Dev

ios:异步请求后重新加载UIPickerView

来自分类Dev

请求结束后,Appengine Python异步urlfetch

来自分类Dev

在异步响应齐发后发送休息请求

来自分类Dev

即使在插入行后,如何在Google表格中编码仍保留选定的单元格引用?

来自分类Dev

在Java中序列化和反序列化后如何保留引用?

来自分类Dev

如何在ARC模式下(例如SKProductsRequest)保留自身,在启动方法中保留自身,然后在响应返回后释放?

来自分类Dev

异步API请求后如何重新路由我的React应用

来自分类Dev

异步GET请求如何工作?

来自分类Dev

如何取消ServiceStack异步请求?

来自分类Dev

外部启动后,如何在独立的Web应用程序中保留会话数据?

来自分类Dev

重新启动后如何在Quartz中保留计划的作业?

来自分类Dev

重新启动后如何使Manjaro Linux保留用户设置?

来自分类Dev

主机重新启动后,如何确保LXD容器保留相同的IP地址?

来自分类Dev

外部启动后,如何在独立的Web应用程序中保留会话数据?

来自分类Dev

分区后如何启动

来自分类Dev

Docker-启动后如何自动在REST容器上发布请求?

来自分类Dev

使用AbortController中止后如何重新启动获取api请求

来自分类Dev

发送使用Spring启动在Java中的异步HTTP请求

来自分类Dev

重新启动后,如何将IP保留在单个节点的dockerized Consul群集中

来自分类Dev

重新启动后,如何在双显示器设置(Unity)上保留桌面的图标位置?

来自分类Dev

如何从自定义UICollectionViewCell启动View Controller

来自分类Dev

合并请求请求后如何更新请求请求的站点?

来自分类Dev

如何监视通过GcmListenerService启动的异步线程

Related 相关文章

  1. 1

    操作后如何保留对数组的引用?

  2. 2

    异步请求后如何处理条件

  3. 3

    SwiftUI中异步请求完成后如何调用函数?

  4. 4

    重新启动后如何保留我的文件?

  5. 5

    重新启动后如何保留网络命名空间

  6. 6

    如何使用VSCode在Firefox中保留扩展名并请求启动

  7. 7

    ios:异步请求后重新加载UIPickerView

  8. 8

    请求结束后,Appengine Python异步urlfetch

  9. 9

    在异步响应齐发后发送休息请求

  10. 10

    即使在插入行后,如何在Google表格中编码仍保留选定的单元格引用?

  11. 11

    在Java中序列化和反序列化后如何保留引用?

  12. 12

    如何在ARC模式下(例如SKProductsRequest)保留自身,在启动方法中保留自身,然后在响应返回后释放?

  13. 13

    异步API请求后如何重新路由我的React应用

  14. 14

    异步GET请求如何工作?

  15. 15

    如何取消ServiceStack异步请求?

  16. 16

    外部启动后,如何在独立的Web应用程序中保留会话数据?

  17. 17

    重新启动后如何在Quartz中保留计划的作业?

  18. 18

    重新启动后如何使Manjaro Linux保留用户设置?

  19. 19

    主机重新启动后,如何确保LXD容器保留相同的IP地址?

  20. 20

    外部启动后,如何在独立的Web应用程序中保留会话数据?

  21. 21

    分区后如何启动

  22. 22

    Docker-启动后如何自动在REST容器上发布请求?

  23. 23

    使用AbortController中止后如何重新启动获取api请求

  24. 24

    发送使用Spring启动在Java中的异步HTTP请求

  25. 25

    重新启动后,如何将IP保留在单个节点的dockerized Consul群集中

  26. 26

    重新启动后,如何在双显示器设置(Unity)上保留桌面的图标位置?

  27. 27

    如何从自定义UICollectionViewCell启动View Controller

  28. 28

    合并请求请求后如何更新请求请求的站点?

  29. 29

    如何监视通过GcmListenerService启动的异步线程

热门标签

归档