You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Parse好友系统:双PFUser查询后如何更新请求状态?

嘿,我来帮你搞定这个好友请求状态更新的问题!首先得假设你应该有一个专门存储好友请求的Parse类(比如命名为FriendRequest),里面至少包含这几个字段:

  • fromUser:PFUser类型,存储发送请求的用户
  • toUser:PFUser类型,存储接收请求的用户
  • status:NSString类型,标记请求状态(比如"pending"表示请求中,"accepted"表示已确认)

接下来是具体的实现步骤和代码:

1. 查询对应的好友请求对象

首先你需要精准定位到那条待确认的请求,也就是发送方是user1、接收方是当前用户、状态为"pending"的记录:

PFUser *currentUser = [PFUser currentUser];
PFQuery *query = [PFQuery queryWithClassName:@"FriendRequest"];
[query whereKey:@"fromUser" equalTo:user1];
[query whereKey:@"toUser" equalTo:currentUser];
[query whereKey:@"status" equalTo:@"pending"];

// 执行异步查询,避免阻塞主线程
[query getFirstObjectInBackgroundWithBlock:^(PFObject * _Nullable request, NSError * _Nullable error) {
    if (!error && request) {
        // 2. 更新请求状态为已确认
        [request setObject:@"accepted" forKey:@"status"];
        [request saveInBackgroundWithBlock:^(BOOL succeeded, NSError * _Nullable error) {
            if (succeeded) {
                NSLog(@"好友请求已成功确认!");
                // 这里可以添加UI刷新逻辑,比如更新好友列表、移除请求提示等
                dispatch_async(dispatch_get_main_queue(), ^{
                    // 主线程更新UI的代码写在这里
                });
            } else {
                NSLog(@"确认失败:%@", error.localizedDescription);
            }
        }];
    } else {
        NSLog(@"未找到对应的好友请求或查询出错:%@", error.localizedDescription);
    }
}];
2. 额外优化:双向添加好友关系(可选但推荐)

如果你的应用需要快速查询用户的好友列表,建议在确认请求后,给两个用户的friends数组字段(如果没有可以新建)互相添加对方的引用:

// 在请求保存成功的block里添加这段代码
if (succeeded) {
    NSLog(@"好友请求已成功确认!");
    
    // 更新当前用户的好友列表
    [currentUser addObject:user1 forKey:@"friends"];
    [currentUser saveInBackground];
    
    // 更新对方用户的好友列表
    [user1 addObject:currentUser forKey:@"friends"];
    [user1 saveInBackground];
    
    // 主线程更新UI
    dispatch_async(dispatch_get_main_queue(), ^{
        // 比如刷新好友列表页面
    });
}
关键注意事项
  • ACL权限设置:确保FriendRequest类的ACL只允许fromUser和toUser修改对应的请求记录,避免其他用户恶意篡改。可以在创建请求时设置:
    PFACL *acl = [PFACL ACLWithUser:fromUser];
    [acl setReadAccess:YES forUser:toUser];
    [acl setWriteAccess:YES forUser:toUser];
    [request setACL:acl];
    
  • 错误处理:一定要处理查询和保存过程中的错误,比如网络问题、权限不足等,给用户友好的提示。
  • 线程安全:所有UI更新操作必须放在主队列执行,避免界面卡顿或崩溃。

内容的提问来源于stack exchange,提问作者Harris Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:18:31