Moe Salih
Moe Salih

Reputation: 723

Parse PFObject.fetch is not updating to current data from server

In my app, I have a screen where the user can edit an object's attributes. The screen has 2 actions: save or revert.

When revert is selected, I want to revert the object's attributes to whatever is stored on the server and discard all local changes. I do this with the the fetch method:

println("1: \(localObject)")
if localObject.isDirty() {
    localObject.fetchInBackgroundWithBlock { serverObject, error in
        println("2: \(localObject)")
        println("3: \(serverObject)")
    }
}

isDirty() works correctly and only returns true if something was locally modified and not saved.

According to the docs, fetch: fetches the PFObject with the current data from the server. But what I see in the log is that all 3 print statements show the same local attributes. I would expect serverObject to be whatever is stored on the server, but it's not, serverObject also shows the locally modified attributes.

I'm not using the Local Datastore.

What is going on? Is this a bug with the Parse SDK? Or is there a caching issue?

Upvotes: 1

Views: 315

Answers (2)

p-sun
p-sun

Reputation: 1846

If you call fetch without using the local datastore, Parse will give you a error in the console.

Since you're not getting an error from Parse when you call fetchInBackgroundWithBlock, it means that at some point you've called localObject.pinInBackground() and placed that object in the local datastore.

For locally stored objects, you can call revert() before fetchInBackgroundWithBlock to discard local changes before updating data from the server.

if localObject.isDirty() {
    localObject.revert()
    localObject.fetchInBackgroundWithBlock { serverObject, error in
        println("2: \(localObject)")
        println("3: \(serverObject)")
    }
}

Upvotes: 2

LulzCow
LulzCow

Reputation: 1229

I haven't seen the docs for fetch, but I do know that you can accomplish what you're trying just by performing a query. Doing the following will query from the server (although you can adjust the cache policy if you've already used the query to look at cache or network first):

var query = PFQuery(className:"GameScore")
query.getObjectInBackgroundWithId("xWMyZEGZ") {
    (gameScore: PFObject?, error: NSError?) -> Void in
    if error == nil && gameScore != nil {
        println(gameScore)
    }else {
       println(error)
    }
}

Alternatively, you could just save a copy of the local object before any changes can be made, and then if it is dirty, you can just replace it with the copy. That's probably what I'd do to reduce the number of parse API calls.

Upvotes: 0

Related Questions