Разбор: правильное использование для закрепленных объектов в расширенных условиях, не связанных с сетью.
Я пишу приложение для iOS с Parse, которое имеет два уровня: бесплатное и подписное. Уровень бесплатного пользования не поддерживает сохранение в облаке созданных объектов, в отличие от уровня подписки. То есть пользователь может бесплатно загружать и использовать приложение в течение всего времени, пока он захочет, и создавать постоянные для устройства объекты в течение этого времени, которые впоследствии будут загружены, если они решат подписаться / войти в систему.
У меня проблемы с не сетевым бесплатным уровнем.
Для разработки этого уровня я использую локальное хранилище данных 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()
я их не сохраняю в облаке разбора. В остальное время приложение открыто, все контроллеры представления, которые отображают измененные aUserData
будет правильно видеть xyz
для значения someUserDataKey
, как и ожидалось.
Однако, если я выйду из приложения из многозадачного режима и снова открою его, aUserData
вернется к abc
за someUserDataKey
, Я не ожидал, что это произойдет; вместо этого я предполагал, что изменения в объектах в локальном хранилище данных сохранятся. Я также думаю, что странно, что оно сохраняется до перезапуска приложения, но не после.
Я нашел способ обойти проблему, которая заключается в aUserData.pin()
после внесения каких-либо изменений в объект. Я не уверен, почему это требуется, и в целом, каково ожидаемое поведение при вызове pin()
второй раз на уже закрепленном объекте.
Каковы лучшие практики для такого рода установки?
1 ответ
Я бы посоветовал вам загружать все объекты во всех случаях, просто не делайте учетную запись доступной на других устройствах / не разрешайте данные, указанные пользователем, до тех пор, пока они не будут зарегистрированы.
Вероятно, самый простой способ сделать это - создать реального пользователя для устройства. Сгенерируйте UUID для имени пользователя и пароля и сохраните их в цепочке ключей устройства. Когда пользователь не зарегистрирован, вы всегда авторизуетесь с этими данными. Когда пользователь регистрируется, вы обновляете текущего пользователя новыми данными и удаляете старые данные из цепочки для ключей.