如何使用解析数据库在iOS应用程序中实现朋友添加/删除功能?

时间:2015-09-14 02:07:01

标签: ios objective-c arrays database parse-platform

我正在尝试实现存储有关用户朋友的数据的功能(请求朋友,收到的朋友请求,已接受的请求)。我有两张桌子。

第一个表是带有用户名列的_User。

第二张桌子是朋友。该表记录了谁是用户的朋友。该表有两个字段:

  1. 指向用户表的指针列
  2. 一个名为receivedRequest的数组列。在这个数组中,我保留了_User的objectId,它们是向该用户发送请求。
  3. 表_User与Friends表有一对一的关系,但同时有一个数组字段保存用户朋友的信息。在这个数组中,我正在保存其他用户的objectId。我正在使用数组来避免为每个朋友的请求重复行。

    拳头我想知道这是一个好主意还是有更好的选择。实际上我有额外的数组列,这是被回收的请求。发送请求。并接受了请求。所有这些都是阵列。

    其次我想知道如何编写查询以转到Friends表。查找当前用户行。转到friendList列。返回名称在该数组中的每个朋友的姓名?

    目前我这样做:

    - (PFQuery *)queryForTable {
    
        //Query user's friend request
        PFQuery *query =  [PFQuery queryWithClassName:@"Friends"];
        [query whereKey:@"user" equalTo:[PFUser currentUser]];
        [query includeKey:@"receivedRequest"];
        return query;
    }
    

    这仅返回使用的ID添加了我当前的用户。我需要来自_User table的名字。

    enter image description here

1 个答案:

答案 0 :(得分:2)

这就是我要做的事情:

(1)用户类应该是关于用户与应用程序的关系,这是一个位于用户和应用程序之间的数据的位置。

(2)对于用户想要共享的数据,请使用具有图像,昵称等的Persona类.Persona应包含指向User的指针,反之亦然。

(3)Personae(常用角色)邀请朋友成为朋友。

(4)字符串对象ids数组=坏,指针数组=好。事实上,我不能想到我更喜欢字符串对象id而不是指针的情况。

(5)朋友邀请应该是它自己的对象,邀请者和被邀请者是Persona的指针。

(6)友谊是一种双边和对称的关系(至少我们一直希望它们是这样)。一个很好的表示可能是一个友谊类,它有一个指向两个Persona对象的指针的数组

给定数据模型,以下是一些函数:

Persona有一个指向User的指针,称之为“user”,而User有一个persona指针。 FriendInvitation有一个inviterinvitee,这两个指向Persona。友谊有一系列指向Persona的两个指针,称之为friends

// get the current user's FriendInvitations
- (void)friendInvitationsWithCompletion:(void (^)(NSArray *, NSError *))completion {
    PFObject *persona = [PFUser currentUser][@"persona"];
    PFQuery *query =  [PFQuery queryWithClassName:@"FriendInvitation"];
    [query whereKey:@"invitee" equalTo:persona];
    [query includeKey:@"inviter"];
    [query findObjectsInBackgroundWithBlock:completion];
}

// get the current user's friendships
// remember, these are not the friends, but the objects that record pairings of friends.
// see the next function for the friends
- (void)friendshipsWithCompletion:(void (^)(NSArray *, NSError *))completion {
    PFObject *persona = [PFUser currentUser][@"persona"];
    PFQuery *query =  [PFQuery queryWithClassName:@"Friendship"];
    [query whereKey:@"friends" equalTo:persona];
    [query includeKey:@"friends"];
    [query findObjectsInBackgroundWithBlock:completion];
}

// get the current user's friends' personae
- (void)friendsWithCompletion:(void (^)(NSArray *, NSError *))completion {
    PFObject *persona = [PFUser currentUser][@"persona"];
    [self friendshipsWithCompletion:^(NSArray *friendships, NSError *error) {
        if (!error) {
            NSMutableArray *result = [@[] mutableCopy];
            for (PFObject *friendship in friendships) {
                NSArray *friends = friendship[@"friends"];
                NSInteger indexOfFriend = ([friends indexOfObject:persona] == 0)? 1 : 0;
                [result addObject:friends[indexOfFriend]];
            }
            completion(result, nil);
        } else {
            completion(nil, error);
        }
    }];
}

// agree to be friends with someone
- (void)becomeFriendsWith:(PFObject *)friend completion:(void (^)(BOOL, NSError *))completion {
    PFObject *persona = [PFUser currentUser][@"persona"];
    PFObject *friendship = [PFObject objectWithClassName:@"Friendship"];
    friendship[@"friends"] = @[ persona, friend ];
    [friendship saveInBackgroundWithBlock:completion];
}

// we could go on, but this should convey the basic ideas