Сохранить текущего пользователя в отношении в разбор с 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 в вашем мобильном приложении.

Другие вопросы по тегам