Какой самый эффективный способ / стратегия для постоянного (не в памяти) в приложении регистрации текста? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть приложение для навигации и отслеживания местоположения.Пока пользователь отслеживает свою поездку, координаты, скорость, временная метка (и некоторые другие) записываются в журнал с каждой входящей координатой. Я не хочу сохранять это в памяти, поскольку это приведет к увеличению памяти приложения при перемещении пользователя.вместе, в конечном итоге, приводит к didReceiveMemoryWarning и даже к падению приложения.(По крайней мере, до сих пор это был мой опыт) * ​​1002 *

Какой самый эффективный способ сделать это?Думая о потреблении батареи, использовании процессора, а также об использовании памяти, если это входит в игру.

Я могу придумать два варианта сделать это:

  1. Войти в файл (что я сейчас делаю, используя этот код):
let newLine: String = "bla bla bla"
let url: URL = URL(string: "someLocalPath")
newLine.appendToURL(url)

extension String {
    func appendToURL(_ fileURL: URL) throws {
        let data = self.data(using: String.Encoding.utf8)!
        try data.appendToURL(fileURL)
    }
}

extension Data {
    func appendToURL(_ fileURL: URL) throws {
        if let fileHandle = try? FileHandle(forWritingTo: fileURL) {
            defer {
                fileHandle.closeFile()
            }
            fileHandle.seekToEndOfFile()
            fileHandle.write(self)
            fileHandle.closeFile()
        }
        else {
            try write(to: fileURL, options: .atomic)
        }
    }
}

Использование базовых данных

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

Итак, чтобы повторить мой вопрос: какой из этих двух вариантов будет более эффективнымс точки зрения батареи, процессора и памяти?

Дополнительный вопрос: возможно, есть другой способ сделать это.Тот, о котором я не думал?

1 Ответ

0 голосов
/ 10 июля 2019

Я нашел другой вариант, который лучше всего работает в моем случае. Надо было думать об этом в первую очередь ??‍♂️.

Итак, я не хотел входить в память, потому что это могло заставить iOS убить мое приложение из-за чрезмерного использования памяти. Но iOS сначала отправляет didReceiveMemoryWarning, после чего вы можете уменьшить объем памяти приложения, предотвращая его уничтожение.

Итак, что я делаю сейчас:

Я добавил переменную экземпляра:

fileprivate var logString: String = ""

И войти в него при получении новой координаты:

logString += newLine

Если / когда я получаю didReceiveMemoryWarning, я записываю весь logString в файл на диске и затем очищаю его:

override func didReceiveMemoryWarning() {
    logString.appendToURL(url)
    logString = ""
}

Таким образом, я пишу на диск только тогда, когда это необходимо (а не с каждой полученной координатой), что намного более энергоэффективно. (Запись на диск требует больше энергии, чем запись в память. Источник: https://developer.apple.com/videos/play/wwdc2016/719/)

Плюс, мое приложение не может быть убито iOS из-за высокого использования памяти, потому что я вовремя очищаю память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...