Добавить PFObject в массив, в результате чего все элементы будут заменены (Swift, Parse)

Я использую Parse для настройки пар пользователей и сохранения matchedRelation в классе UserRelations. Однако я обнаружил странную проблему, когда при добавлении PFObject в массив PFObject все элементы в этом массиве будут заменены, в то время как при использовании AnyObject Array это совершенно нормально. Пожалуйста, помогите мне выяснить, что не так.

query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {
            var pairRelation = PFObject (className: "UserRelations")
            var pairRelations = [PFObject]()
            var testArray = [AnyObject]()

            for object in objects {

                pairRelation.setObject(object.username, forKey: "toUser")
                pairRelation.setObject(PFUser.currentUser()!, forKey: "fromUser")
                pairRelation.setObject(true, forKey: "isMatched")

                pairRelations.append(pairRelation)
                testArray.append(object.username)

                println("After append the results of the Array is: \(pairRelations)")
                println("\nAfter append the results of the test Array is: \(testArray)")

            }
        } 
    }

Вывод для первых трех совпадений показан здесь:

After append the results of the Array is: [<UserRelations: 0x7fe22b0713c0, objectId: new, localId: (null)> {
fromUser = "<PFUser: 0x7fe22b127670, objectId: 3WXg5FUEsE>";
isMatched = 1;
toUser = "[email protected]";}, <UserRelations: 0x7fe22b0713c0, objectId: new, localId: (null)> {
fromUser = "<PFUser: 0x7fe22b127670, objectId: 3WXg5FUEsE>";
isMatched = 1;
toUser = "[email protected]";}, <UserRelations: 0x7fe22b0713c0, objectId: new, localId: (null)> {
fromUser = "<PFUser: 0x7fe22b127670, objectId: 3WXg5FUEsE>";
isMatched = 1;
toUser = "[email protected]";}]

After append the results of the test Array is: 
[[email protected], [email protected], [email protected]]

Таким образом, массив PFObject получил одни и те же элементы после добавления, в то время как массив пыльников получил всех трех разных пользователей. Спасибо за любой комментарий/помощь!


person JDG    schedule 20.07.2015    source источник
comment
Тот же элемент в массиве PFObject добавляется последним.   -  person JDG    schedule 21.07.2015
comment
Попробуйте перенести строку var pairRelation = PFObject (className: "UserRelations") внутрь цикла for object in objects.   -  person Kyle H    schedule 21.07.2015
comment
@KyleH прав. Когда вы создаете переменную pairRelation, она выделяет место в вашей памяти для этого объекта. Когда вы делаете setObject, он соответственно обновит объект, но во второй и третий раз он обновит один и тот же объект. Под капотом массив будет содержать указатели на объекты, а не на сам объект, а в вашем случае 3 одинаковых указателя.   -  person Mattias    schedule 21.07.2015
comment
@KyleH, ты прав! Я пропустил ваш ответ и понял это сам, но потребовалось гораздо больше времени, чтобы понять... Спасибо!   -  person JDG    schedule 21.07.2015
comment
@JDG Хорошо, хорошо! Я расскажу об этом для ответа.   -  person Kyle H    schedule 21.07.2015


Ответы (1)


В настоящее время вы создаете один экземпляр вашего PFObject с именем pairRelation. Итак, внутри вашего цикла вы всегда обновляете один и тот же объект в памяти.

Просто переместите эту строку внутрь цикла, чтобы каждый раз создавать новый PFObject:

query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {
            var pairRelations = [PFObject]()
            var testArray = [AnyObject]()

            for object in objects {
                var pairRelation = PFObject (className: "UserRelations") //Create new PFObject

                pairRelation.setObject(object.username, forKey: "toUser")
                pairRelation.setObject(PFUser.currentUser()!, forKey: "fromUser")
                pairRelation.setObject(true, forKey: "isMatched")

                pairRelations.append(pairRelation)
                testArray.append(object.username)

                println("After append the results of the Array is: \(pairRelations)")
                println("\nAfter append the results of the test Array is: \(testArray)")

            }
        } 
    }
person Kyle H    schedule 21.07.2015