Сохранить текущего пользователя в отношении в разбор с Swift
У меня есть система, в которой, когда текущий пользователь принимает запрос, мое приложение добавляет связь между пользователем, который отправил запрос текущему пользователю.
Однако я также хочу, чтобы текущий пользователь был добавлен в отношение другого пользователя, чтобы не только текущий пользователь имел отношение.
Мой код для текущего пользователя работает, но не для другого пользователя.
//i use this pattern to add the requester to a friends relation to the current user
var relation = PFUser.currentUser()!.relationForKey("Friends")
relation.addObject(passenger as PFObject)
PFUser.currentUser()!.saveInBackground()
Когда я пытаюсь сделать то же самое для пассажира, это не добавляет отношения
var relation = passenger.relationForKey("Friends")
relation.addObject(PFUser.currentUser()!.self as PFObject)
passenger.saveInBackground()
Изменить 1:
После долгих исследований я нашел ответ, который говорит, что мне нужен облачный код. /questions/35138016/ios-parsecom-pfrelation-dlya-dobavleniya-druzej-dobavlyaet-tolko-otnosheniya-dlya-tekuschego-polzovatelya-a-ne-dlya-dobavlyaemogo-druga/35138032#35138032 Это единственный способ или есть альтернатива? Может ли кто-нибудь предоставить решение для облачного кода?
Изменить 2:
Я ответил на свой вопрос. Вам нужно будет отредактировать облачный код в соответствии с вашими потребностями. Самая важная вещь, которая помогла мне, - это умение запрашивать пользовательский класс в облачном коде и получать текущего пользователя в облачном коде.
2 ответа
Хорошо, через некоторое время я смог найти решение для своего сценария. Это должно работать для простых отношений, когда пользователь принимает другого пользователя.
Сначала мой быстрый код. Важно отметить, что я создал функцию, которая принимает PFUser в качестве параметра. Я сделал это для рефакторинга большей функции. Этот пользователь - пользователь, которому мы хотим сохранить текущего пользователя в облачном коде.
func createRelation(otherUser: PFUser)
{
let fromUser: PFUser = otherUser
let params = NSMutableDictionary()
params.setObject(fromUser.objectId!, forKey: "Friends")
PFCloud.callFunctionInBackground("addFriendToFriendsRelation", withParameters: params as [NSObject : AnyObject] ) {
(object:AnyObject?, error: NSError?) -> Void in
//add the person who sent the request as a friend of the current user
let friendsRelation: PFRelation = self.currentUser!.relationForKey("Friends")
friendsRelation.addObject(fromUser)
self.currentUser!.saveInBackgroundWithBlock({
(succeeded: Bool, error: NSError?) -> Void in
if succeeded {
println("Relation added to the current user")
} else {
println("Handle error in adding relation to current user ")
}
})
}
}
Теперь для разбора облачного кода
Parse.Cloud.define("addFriendToFriendsRelation", function(request, response) {
Parse.Cloud.useMasterKey();
//get the friend requestId from params
var friendRequestId = request.params.Friends;
var query = new Parse.Query(Parse.User);
//get the friend request object
query.get(friendRequestId, {
success: function(friendRequest) {
//get the user the request was from
var fromUser = friendRequest;
//get the user the request is to
var toUser = Parse.User.current() ;
var relation = fromUser.relation("Friends");
//add the user the request was to (the accepting user) to the fromUsers friends
relation.add(toUser);
//save the fromUser
fromUser.save(null, {
success: function() {
response.success("saved relation and updated friendRequest");
},
error: function(error) {
response.error(error);
}
});
},
error: function(error) {
response.error(error);
}
});
});
Кроме того, убедитесь, что вы используете команду parse deploy
в каталоге parse для обновления main.js
Это единственный способ, афаик. Следуйте этому руководству, чтобы настроить среду облачного кода, если вы этого еще не сделали: https://parse.com/apps/quickstart
Затем вы должны определить функцию (код после настройки будет содержать пример функции "hello world", чтобы вы могли скопировать определение из нее). Для изменения отношений вы должны обратиться к их JS API документам - https://parse.com/docs/js/api/symbols/Parse.Relation.html
(Примечание: для того, чтобы он работал, он должен содержать строку Parse.Cloud.useMasterKey(), прежде чем пытаться изменить пользователей)
После того, как ваша функция реализована и облачный код развернут (анализируем развертывание), используйте PFCloud.callFunctionInBackground в вашем мобильном приложении.