我有一个(基于自定义链表的)队列,我想在应用启动时反序列化,在应用停止时进行序列化,例如(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
,而不会失败。
此外,我应该注意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")
})
}
}
最后,我会指出:
我的queue
很好地符合Codable协议-至少没有编译器错误。如果超出此范围的实现很重要,请告诉我,我将演示它。
崩溃是在我退出应用程序后几秒钟发生的,而processRequests
函数的执行则在