解析:在扩展的非网络条件下正确使用固定对象



我正在用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的视图控制器将正确地看到xyzsomeUserDataKey值,如预期的那样。

然而,如果我从多任务视图退出应用程序并重新打开它,aUserData将为someUserDataKey恢复到abc。我没想到会发生这种事;相反,我认为对本地数据存储中的对象的修改将保持不变。我还觉得奇怪的是,它会一直持续到应用重新启动,而不是之后。

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

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

我建议你在所有情况下都上传所有对象,只是不要让帐户在其他设备上可用/允许用户指定登录细节,直到它注册。

也许最简单的方法是为设备创建一个真正的用户。为用户名和密码生成uuid,并将它们存储在设备密钥链中。当用户未注册时,您总是使用这些详细信息登录。当用户注册时,您使用新的详细信息更新当前用户,并从keychain中删除旧的详细信息。

最新更新