Разбор: правильное использование для закрепленных объектов в расширенных условиях, не связанных с сетью.

Я пишу приложение для iOS с Parse, которое имеет два уровня: бесплатное и подписное. Уровень бесплатного пользования не поддерживает сохранение в облаке созданных объектов, в отличие от уровня подписки. То есть пользователь может бесплатно загружать и использовать приложение в течение всего времени, пока он захочет, и создавать постоянные для устройства объекты в течение этого времени, которые впоследствии будут загружены, если они решат подписаться / войти в систему.

У меня проблемы с не сетевым бесплатным уровнем.

Для разработки этого уровня я использую локальное хранилище данных Parse. Допустим, пользователь создает UserDataPFObject:

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 для имени пользователя и пароля и сохраните их в цепочке ключей устройства. Когда пользователь не зарегистрирован, вы всегда авторизуетесь с этими данными. Когда пользователь регистрируется, вы обновляете текущего пользователя новыми данными и удаляете старые данные из цепочки для ключей.

Другие вопросы по тегам