1

我正在用 Parse 编写一个 iOS 应用程序,它有两层:免费和订阅。免费层不支持创建对象的云持久性,而订阅层支持。也就是说,欢迎用户免费下载和使用该应用程序,只要他们愿意,并在此期间创建设备持久对象,如果他们选择订阅/登录,稍后将被上传。

我在使用非联网免费套餐时遇到问题。

为了构建这一层,我使用 Parse 的本地数据存储。假设用户创建了一个UserData PFObject

let newUserData = PFObject.objectWithClassName("UserData")
newUserData["someUserDataKey"] = "abc"
newUserData.pinInBackground()

这部分很好。我能够查询本地数据存储UserData对象并创建一个表视图。我遇到的问题是当用户稍后更改这些对象之一的值时:

// aUserData is an instance of PFObject which has already 
// been pinned to the local datastore
aUserData["someUserDataKey"] = "xyz"

然后我不会调用任何版本的aUserData.save(),因为我没有将它们保存在 Parse 云中。在应用程序打开的其余时间,所有显示修改的视图控制器都aUserData将正确地看到xyz的值someUserDataKey,正如预期的那样。

但是,如果我从多任务视图中退出应用程序并重新打开它,aUserData将恢复为abcfor someUserDataKey。我没想到会发生这种情况;相反,我认为对本地数据存储中对象的修改会持续存在。我也认为奇怪的是它确实会持续到应用程序重新启动,但不会在重新启动之后。

我发现了解决该问题的方法,即aUserData.pin()在对对象进行任何更改后调用。我不确定为什么需要这样做,更一般地说,pin()在已经固定的对象上第二次调用时预期的行为是什么。

这种设置的最佳实践是什么?

4

1 回答 1

0

I'd suggest you do upload all objects in all cases, just don't make the account available on other devices / allow user specified login details until its signed up.

Probably the easiest way to do this is to actually create a real user for the device. Generate UUIDs for the username and password and store them in the device keychain. When the user isn't signed up you always login with those details. When the user signs up you update the current user with the new details and delete the old details from the keychain.

于 2015-09-24T22:04:47.543 回答