当前位置: 首页 > 知识库问答 >
问题:

ios - 朋友圈的功能,需要显示状态的点赞数和评论数,但是点赞和评论的接口都是 block异步获取,在格式化 model的时候无法正常获取,请问有没有更好的办法 ?

魏彦
2024-09-21

我写的是一朋友圈的功能,需要显示状态的点赞数和评论数,但是点赞和评论的接口都是 block异步获取,在格式化 model的时候无法正常获取,所以想请求解决方法,非常感谢。

-(HxAlbumModel *)factoryModel:(BmobObject *)obj statusType:(StatusType)type{
    hxAlbum *albumOBj = [[hxAlbum alloc] initFromBmobObject:obj];
    NSMutableArray* photos=[NSMutableArray array];
        NSArray * albumPhotos = [obj objectForKey:@"albumPhotos"];
        if (albumPhotos.count !=0) {
            for(NSString * photoUrl in albumPhotos){
                hxAlbumPhoto *photo = [hxAlbumPhoto photoWithOriginUrl:photoUrl thumbnailUrl:[NSString stringWithFormat:@"%@!/format/png",photoUrl]];
                [photos addObject:photo];
            }
        }
//这里格式化 model数据,其中的commentArray和digArray 需要从 block块内异步获取的,这里我就不知道如何操作比较好,所以想问问。非常感谢。
    HxAlbumModel*model = [HxAlbumModel hxAlbuMmodelWithType:Status_ENUM_TYPE fromUser:albumOBj.creator bmobOject:albumOBj avatar:[albumOBj.creator objectForKey:KEY_AVATAR] time:[albumOBj.createdAt stringWithFormat:@"MM-dd HH:mm"] statusID:albumOBj.objectId statusCreateAt:[NSString stringWithFormat:@"%.3lf",[albumOBj.createdAt timeIntervalSince1970]] digArray:albumOBj.toDigs commentArray:albumOBj.toStatusComments contentText:albumOBj.timeline photosArray:photos statusContentRelatedType:nil];
    return model;
}
//查询点赞的关联表
- (void)queryDigsRelation:(NSString*)statusID toDigs:(void(^)(NSMutableArray * toDigs))sucessed{
    //关联对象表
    BmobQuery *bquery = [BmobQuery queryWithClassName:@"_User"];
    //需要查询的列
    BmobObject *post = [BmobObject objectWithoutDataWithClassName:@"hxAlbum" objectId:statusID];
    [bquery whereObjectKey:@"toDigs" relatedTo:post];
    [bquery findObjectsInBackgroundWithBlock:^(NSArray *array, NSError *error) {
        if (error) {
            NSLog(@"%@",error);
        }else{
            [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                BmobObject *user = obj;
                NSLog(@"===%@",[user objectForKey:@"username"]);
            }];
            sucessed([array copy]);
        }
    }];
}

共有2个答案

拓拔意
2024-09-21
  1. 在点赞和评论数据从数据库获取后,再初始话model,再去渲染界面 , 这两个查询都是异步的,有一个异步函数dispatch group quen可以实现当这两个异步函数都处理完某些任务后通知你的做model初始化的操作
别开诚
2024-09-21

在你的情况下,由于点赞和评论的数据是异步获取的,而你在格式化 HxAlbumModel 时需要这些数据,你需要调整你的代码结构来适应异步数据的处理。一个常见的做法是使用回调、闭包(block)或者使用响应式编程(如 RxSwift, Combine 等)来管理异步流。

这里,我将展示如何使用闭包(block)来重构你的代码,以便在数据可用时更新你的模型。

重构思路

  1. 修改 factoryModel 方法,使其接受一个完成回调,该回调在异步数据加载完成后被调用。
  2. 在调用 queryDigsRelation 方法时,将结果传递给 factoryModel 的完成回调。

示例代码

首先,修改 factoryModel 方法以接受一个额外的完成回调参数:

typedef void (^HxAlbumModelCompletionBlock)(HxAlbumModel * _Nullable model, NSError * _Nullable error);

- (void)factoryModel:(BmobObject *)obj statusType:(StatusType)type completion:(HxAlbumModelCompletionBlock)completion {
    hxAlbum *albumOBj = [[hxAlbum alloc] initFromBmobObject:obj];
    NSMutableArray *photos = [NSMutableArray array];
    NSArray *albumPhotos = [obj objectForKey:@"albumPhotos"];
    if (albumPhotos.count != 0) {
        for (NSString *photoUrl in albumPhotos) {
            hxAlbumPhoto *photo = [hxAlbumPhoto photoWithOriginUrl:photoUrl thumbnailUrl:[NSString stringWithFormat:@"%@!/format/png", photoUrl]];
            [photos addObject:photo];
        }
    }

    // 初始化模型但不包含点赞和评论
    HxAlbumModel *model = [HxAlbumModel hxAlbuMmodelWithType:Status_ENUM_TYPE fromUser:albumOBj.creator bmobOject:albumOBj avatar:[albumOBj.creator objectForKey:KEY_AVATAR] time:[albumOBj.createdAt stringWithFormat:@"MM-dd HH:mm"] statusID:albumOBj.objectId statusCreateAt:[NSString stringWithFormat:@"%.3lf", [albumOBj.createdAt timeIntervalSince1970]] digArray:@[] commentArray:@[] contentText:albumOBj.timeline photosArray:photos statusContentRelatedType:nil];

    // 异步获取点赞和评论
    [self queryDigsRelation:albumOBj.objectId toDigs:^(NSMutableArray *toDigs) {
        // 假设还有一个方法来获取评论
        [self queryCommentsRelation:albumOBj.objectId toComments:^(NSMutableArray *toComments) {
            // 更新模型
            model.digArray = toDigs;
            model.commentArray = toComments;
            
            // 调用完成回调
            completion(model, nil);
        }];
    }];
}

// 假设的获取评论的方法
- (void)queryCommentsRelation:(NSString *)statusID toComments:(void(^)(NSMutableArray *toComments))sucessed {
    // 这里实现获取评论的逻辑
    // 完成后调用 sucessed
}

注意:

  • factoryModel 现在是一个异步方法,它不会立即返回模型,而是在数据准备好后通过回调返回。
  • 我添加了一个假设的 queryCommentsRelation 方法来模拟获取评论的过程,你需要根据你的实际API来实现它。
  • queryDigsRelation 的回调中,我们调用了 queryCommentsRelation 并在获取到所有需要的数据后更新了模型并调用了完成回调。

这样,你就可以在数据完全加载后处理或显示你的模型了。

 类似资料:
  • 本文向大家介绍uni-app实现点赞评论功能,包括了uni-app实现点赞评论功能的使用技巧和注意事项,需要的朋友参考一下 模拟朋友圈实时点赞及评论功能 点赞思路:点击的时候,使用push(点赞)以及slice(取消赞)方法处理数组,并且调用点赞接口 评论思路:点击的时候,写多一个评论列表,当点击发送的时候commentStatus=true,且索引等于点击的索引。同时调用获取评论列表的接口 ht

  • 我阅读了Instagram订阅API的新文档。它说,在你订阅后,当人们在他们的页面上发布新媒体时,Instagram会通知你。 我想被通知当一个用户的帖子收到一个新的喜欢或评论? 你觉得这可能吗?

  • 本文向大家介绍Android PraiseTextView实现朋友圈点赞功能,包括了Android PraiseTextView实现朋友圈点赞功能的使用技巧和注意事项,需要的朋友参考一下 PraiseTextView 说明 我是将朋友圈分成了几个独立模块单独自定义的View,通过回调完成交互,耦合性算是非常低了,主要有以下及部分: 1.评论布局(自定义TextView) CommentListTe

  • 我想喜欢一个关于脸书的帖子的评论,我使用和喜欢帖子一样的。对于一个帖子来说,它是有效的,但是对于一个评论来说,它是无效的。 医生:https://developers.facebook.com/docs/graph-api/reference/object/likes 我的代码: 错误是: error Domain = com . Facebook . SDK Code = 5 "操作无法完成。(

  • 使用方法:进入动态-查看别人动态-评论/点赞

  • 请求header GET /v1/activity/{频道id}/comments/count Authorization:Bearer {ACCESS TOKEN} 注: 请将上方的{ACCESS TOKEN}替换为您的ACCESS TOKEN 请将"{频道id}"替换您需要获取的频道id 返回 { "count": 100 } 返回参数说明 参数 描述 类型 备注 count 数目