parse-platformparse-serverpfobject

Changing the ACL on a PFObject does not persist to the Parse Server


When I save a change to the ACL on a PFObject (in this case, making it publicly writeable), the completion block runs successfully but the change is not actually saved to the server. Re-fetching the object, or viewing it via Parse Dashboard, shows that the ACL change is not persisted. In fact, I have verified via server logging that Parse server never even receives a request.

// first fetch an object from the parse server, then...
print("before: \(object.acl?.hasPublicWriteAccess)") // "false"
object.acl?.hasPublicWriteAccess = true
object.saveInBackground { (success, error) in
    // confirm that success is true and error is nil
    print("after: \(object.acl?.hasPublicWriteAccess)") // "true" - object is updated client-side

    // now, re-fetch the same object or check it in Parse Dashboard. It is not saved as publicly editable.
}

Solution

  • When changing an object's ACL, the object itself is not marked as 'dirty', so saving it does not result in a request to the server. You can verify this by checking the isDirty property on the object after changing the ACL.

    This is in common with other PFObjects - a change to a pointer property does not mark the parent object as dirty. This is not normally encountered since it is natural to simply save the pointer object itself. Since there is no PFACL.save() function, we can instead re-set the acl property on the object to ensure that it is marked as dirty:

    object.acl?.hasPublicWriteAccess = toggle.isOn
    object.acl = object.acl
    object.saveEventually()
    

    Additional discussion of this can be found in this issue.