我正在用 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
将恢复为abc
for someUserDataKey
。我没想到会发生这种情况;相反,我认为对本地数据存储中对象的修改会持续存在。我也认为奇怪的是它确实会持续到应用程序重新启动,但不会在重新启动之后。
我发现了解决该问题的方法,即aUserData.pin()
在对对象进行任何更改后调用。我不确定为什么需要这样做,更一般地说,pin()
在已经固定的对象上第二次调用时预期的行为是什么。
这种设置的最佳实践是什么?