我正在编写一个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
的{{1}}值,如预期的那样。
但是,如果我从多任务处理视图中退出应用并重新打开它,则someUserDataKey
将恢复为aUserData
abc
。我没想到会发生这种情况;相反,我想象对本地数据存储区中对象的修改会持续存在。我也认为奇怪的是它会一直持续到应用程序重新启动,但不会在之后。
我发现了解决问题的方法,即在对对象进行任何更改后调用someUserDataKey
。我不确定为什么这是必需的,更常见的是在已经固定的对象上第二次调用aUserData.pin()
时的预期行为。
此类设置的最佳做法是什么?
答案 0 :(得分:0)
我建议您在所有情况下都上传所有对象,只是不要在其他设备上提供该帐户/允许用户指定的登录详细信息,直到注册为止。
最简单的方法可能是为设备创建真实用户。为用户名和密码生成UUID并将其存储在设备密钥链中。当用户未注册时,您始终使用这些详细信息登录。当用户注册时,您使用新的详细信息更新当前用户,并从钥匙串中删除旧的详细信息。