2016-05-27 4 views
0

У меня есть игра, и я постоянно сохраняю прогресс пользователя. Это чрезвычайно быстро развивающаяся игра, и в некоторые моменты игры огромная прогрессия пользователя может случиться 6 раз в секунду, что требует от меня хранения нескольких переменных прогрессии в NSUserDefaults и синхронизации 6 раз в секунду. Это отлично работает на моем iPhone6s 64gb, но я боюсь, что это не может быть iPhone 4 16gb.Проблемы с NSUserDefaults

У меня нет возможности проверить его, потому что симулятор не очень точен с такими вещами, и у меня нет более медленного устройства. Я также не могу найти много подробностей о отчетах о предварительной работе NSUserDefaults в документации. Кто-нибудь имеет какие-либо знания по этой теме?

Я рассматриваю возможность хранения переменных в локальном NSDictionary. Я определяю в своем .h, а затем просто сохраняю и синхронизирую NSUserDefaults один раз во время appWillResignActive, но я беспокоюсь о потере данных в случае сбоя, и т. д. Я полагаю, что у меня мог бы быть NSTimer и сохранять данные каждые 5 секунд или около того, а также сэкономить на appWillResignActive, чтобы минимизировать потерю в случае сбоя; Я бы предпочел не переписывать большие объемы моего кода, хотя над чем-то, что NSUserDefaults может обрабатывать только штрафом на более мелких устройствах.

+0

Обратите внимание, что вызов «synchronize» не имеет ничего общего с записью данных на диск. Это просто синхронизация с другим приложением, которое читает и записывает один и тот же магазин по умолчанию (это невероятно редко, а для приложений, отличных от Apple, практически невозможно использовать на iOS). 'synchronize' скоро (окончательно) будет устаревшим, потому что он не делает ничего похожего на то, что думают люди. См. Запись о правильном использовании NSUserDefaults у своего сопровождающего: http://dscoder.com/defaults.html –

+0

Спасибо @RobNapier Я не знал об этом! –

+0

В то время как я согласен с ответами, вы слишком часто набираете «synchronize», я хочу отметить, что ваша «озабоченность», вероятно, необоснованна ... Сколько у ваших пользователей на самом деле все еще есть iPhone 4? [Эта ссылка] (https://mixpanel.com/trends/#report/iphone_models/from_date:-20,to_date:0) предполагает, что доля рынка составляет всего около 1%. Я бы посоветовал не тратить большую часть своего времени на оптимизацию для 1% –

ответ

3

Не вызывайте синхронизацию 6 раз в секунду. (Не выполняйте никаких операций с дисками 6 раз в секунду.) Система заботится о сохранении пользовательских настроек по умолчанию для вас. Как вы говорите, вызов синхронизации в appWillResignActive является разумным или между уровнями.

Если вы столкнулись с крахом, следует ожидать некоторую потерю данных. Однако хорошо написанное приложение не должно терпеть крах. Если вы ругаетесь с какой-либо регулярностью, это ваша проблема, а не синхронизация пользовательских настроек по умолчанию. (не говорит, что ваше приложение делает это)

+0

Звучит неплохо, поэтому я просто храню в NSUserDefaults часто и звоню синхронизировать каждую минуту или около того по таймеру, а также по appWillResignActive –

+1

@AlbertRenshaw. Нет причин для вызова 'synchronize' каждую минуту, если вы не ожидаете, что ваше приложение будет аварийно завершено , – rmaddy

+0

@rmaddy Я не ожидаю, что мое приложение когда-нибудь потерпит крах;) Но я считаю, что лучше безопасно, чем извините –

2

NSUserDefaults всего лишь NSDictionary в памяти. Если вам не нужно называть synchronize каждый раз, когда вы устанавливаете значение, у вас не будет проблем. ОС будет постоянно сохранять представление в памяти. Конечно, не раз несколько раз в секунду.

Так что используйте NSUserDefaults так часто, как вы хотите. Только звоните synchronize в редкие моменты, например, когда ваше приложение становится неактивным или входит в фоновый режим.

+0

Я звонил в синхронизацию каждый раз, когда я сохранял переменную ха-ха, я перестану это делать-спасибо! –

Смежные вопросы