EXC_BAD_ACCESS (code = 2) при использовании JSONEncoder.encode () - PullRequest
0 голосов
/ 09 октября 2018

У меня есть очередь (настраиваемая, на основе связанного списка), которую я хочу десериализовать при запуске приложения и сериализовать, когда приложение останавливается, вот так (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останавливается сразу после

...