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

Я пишу приложение для 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(), так как не сохраняю их в облаке Parse. В остальное время приложение открыто, все контроллеры представления, которые отображают измененное aUserData, будут правильно видеть xyz для значения someUserDataKey, как и ожидалось.

Однако, если я выйду из приложения из режима многозадачности и снова открою его, aUserData вернется к abc для someUserDataKey. Я не ожидал, что это произойдет; вместо этого я предполагал, что изменения объектов в локальном хранилище данных сохранятся. Я также думаю, что странно, что он сохраняется до перезапуска приложения, но не после.

Я нашел обходной путь для проблемы, заключающийся в вызове aUserData.pin() после внесения любых изменений в объект. Я не уверен, зачем это нужно, и вообще, каково ожидаемое поведение при повторном вызове pin() для уже закрепленного объекта.

Каковы наилучшие практики для такого рода настроек?


person nmelehan    schedule 24.09.2015    source источник
comment
Вы не используете фреймворк ожидаемым образом. Закрепление похоже на локальное сохранение, но строго не ожидается, что вы захотите сохранить только локально, ожидается, что вы захотите сохранить в сети, даже если это не произойдет немедленно. У вас, вероятно, будут другие проблемы в будущем, если вы будете использовать отношения. Было бы лучше использовать свое собственное локальное хранилище данных и сохранять в сеть, когда это требуется явно оттуда...   -  person Wain    schedule 25.09.2015
comment
Ну, цель состоит в том, что как только они войдут в систему с подпиской, все созданные ими закрепленные объекты будут загружены в облако Parse. Преимущество использования Parse таким образом заключается в том, что мне не нужно раздваивать реализацию моей модели на бесплатную или подпрограмму; Кроме того, я пользуюсь преимуществами автоматической миграции анонимных пользователей Parse —> зарегистрированных пользователей для объектов PFObject, созданных на этапе бесплатного использования. Так что да, будет облом, если я не смогу сделать это таким образом.   -  person nmelehan    schedule 25.09.2015


Ответы (1)


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

Вероятно, самый простой способ сделать это — создать реального пользователя для устройства. Сгенерируйте UUID для имени пользователя и пароля и сохраните их в цепочке ключей устройства. Когда пользователь не зарегистрирован, вы всегда входите в систему с этими данными. Когда пользователь регистрируется, вы обновляете текущего пользователя новыми данными и удаляете старые данные из цепочки для ключей.

person Wain    schedule 24.09.2015
comment
Parse поддерживает встроенный автоматический рабочий процесс анонимного пользователя, так что я не думаю, что вторая часть — это разработка, которую мне нужно делать. Я мог бы загружать все для пользователей бесплатного уровня, но я хотел избежать этого, чтобы не нести затраты на запросы API для тех, кто не приносит доход. Если нет официального заявления о том, является ли повторное закрепление объектов четко определенным поведением, я думаю, мне придется взвесить, следует ли мне загружать данные бесплатного уровня и нести денежные затраты, или разработать модель, не относящуюся к Parse, в моем коде для люди бесплатного уровня. - person nmelehan; 25.09.2015