使用JSONEncoder.encode()时为EXC_BAD_ACCESS(code = 2)

时间:2018-10-09 07:33:34

标签: ios swift grand-central-dispatch exc-bad-access

我有一个(基于自定义链表的)队列,我想在应用启动时反序列化,在应用停止时进行序列化,例如(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,而不会失败。

此外,我应该注意peakdequeue操作 是从后台线程在队列上进行的。由于我对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")
        })
    }
}

最后,我会指出:

  • 我的queue很好地符合Codable协议-至少没有编译器错误。如果超出此范围的实现很重要,请告诉我,我将演示它。

  • 崩溃是在我退出应用程序后几秒钟发生的,而processRequests函数的执行则在

  • 之后立即停止

0 个答案:

没有答案