У меня есть очередь (настраиваемая, на основе связанного списка), которую я хочу десериализовать при запуске приложения и сериализовать, когда приложение останавливается, вот так (AppDelegate.swift):
func applicationWillResignActive(_ application: UIApplication) {
RequestManager.shared.serializeAndPersistQueue()
}
func applicationDidBecomeActive(_ application: UIApplication) {
RequestManager.shared.deserializeStoredQueue()
}
Проблемаво время сериализации, когда я выхожу из приложения.Вот код, который работает:
public func serializeAndPersistQueue() {
do {
let encoder = JSONEncoder()
let data = try encoder.encode(queue) // Bad access here
if FileManager.default.fileExists(atPath: url.path) {
try FileManager.default.removeItem(at: url)
}
FileManager.default.createFile(atPath: url.path, contents: data, attributes: nil)
}
catch {
print(error)
}
}
Как видите, довольно просто.Он использует JSONEncoder для преобразования моего queue
в объект данных, а затем записывает эти данные в файл со значением url
.
Однако во время encoder.encode () я получаю EXC_BAD_ACCESS
каждый раз, безfail.
Кроме того, я должен отметить, что операции peak
и dequeue
выполняются в очереди из фонового потока.Я не уверен, имеет ли это значение из-за моего непонимания вокруг GCD.Вот как выглядит этот метод:
private func processRequests() {
DispatchQueue.global(qos: .background).async { [unowned self] in
let group = DispatchGroup()
let semaphore = DispatchSemaphore(value: 0)
while !self.queue.isEmpty {
group.enter()
let request = self.queue.peek()!
self.sendRequest(request: request, completion: { [weak self] in
_ = self?.queue.dequeue()
semaphore.signal()
group.leave()
})
semaphore.wait()
}
group.notify(queue: .global(), execute: { [weak self] in
print("Ending the group")
})
}
}
Наконец, я отмечу, что:
My queue
очень хорошо соответствует протоколу Codable - хорошонет ошибок компилятора, по крайней мере.Если его реализация выходит за рамки этого, дайте мне знать, и я покажу его.
Сбой происходит через несколько секунд после выхода из приложения во время выполнения функции processRequests
останавливается сразу после