我正在建立2个用户之间的私聊。目前我已经向所有人开放了“聊天”课程(读/写),并且所有消息(对象)都在这里。
我正在考虑添加具有只允许在两个用户之间阅读的权限的对象,这样他们才能看到他们聊天的内容。
我正在使用以下方式抓取消息:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
PFQuery *fquery = [PFUser query]; // query to get the chat partener
[fquery whereKey:@"objectId" equalTo:[[NSUserDefaults standardUserDefaults] stringForKey:@"friendid"]];
PFUser *friend = (PFUser *)[fquery getFirstObject]; // got it!
PFQuery *query = [PFQuery queryWithClassName:@"Chat"]; // new query for grabbing messages
[query whereKey:PF_CHAT_ROOM equalTo:chatroom]; // @"Chat" = @"Chat"
if (message_last != nil) [query whereKey:PF_CHAT_CREATEDAT greaterThan:message_last.date];
[query includeKey:PF_CHAT_USER]; // current user
[query includeKey:[NSString stringWithFormat:@"%@", friend]]; // its friend/partener
[query orderByAscending:PF_CHAT_CREATEDAT]; // sort by date
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{
// adding the messages to an array;
}];
用于编写要解析的消息:
PFObject *object = [PFObject objectWithClassName:@"Chat"]; // class name
object[PF_CHAT_ROOM] = chatroom;
object[PF_CHAT_USER] = [PFUser currentUser];
object[PF_CHAT_TEXT] = text;
PFQuery *query = [PFUser query];
[query whereKey:@"objectId" equalTo:[[NSUserDefaults standardUserDefaults] stringForKey:@"friendid"]];
PFUser *friend = (PFUser *)[query getFirstObject]; // query to get the chat partener
PFACL *roleACL = [PFACL ACL];
[roleACL setReadAccess:YES forUser:[PFUser currentUser]];
[roleACL setReadAccess:YES forUser:friend]; // setting read permission for those guys
object.ACL = roleACL;
[object saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error)
{
....
}];
这是正确的方法吗?
答案 0 :(得分:1)
我已经实现了一个类似的应用程序采用相同的方法,似乎工作。但我认为你已经过度复杂了。
您需要一个您似乎拥有的聊天课程。这可能类似于:
Chat
Object ID, Message, Author, Date, Date Seen, ACL, etc....
(there's many good schemas out there just google it)
然后,当您向朋友创建新的聊天消息时,您只需创建一个新的PFObject,将其他用户的ACL权限设置为您已正确完成。
用户可以通过调用
来阅读他的消息PFQuery *query = [PFQuery queryWithClassName:@"Chat"];
查询的响应只是用户具有读取权限的聊天,而不是每个人的聊天。因此,除非您正在查找未读消息等,否则无需指定任何其他查询参数。