0

我有一个 JSONEncoder 编码一个 20mb 的文件,需要很长时间才能处理。如果它正在处理的数据发生变化,我想取消编码,并重新启动编码过程,但我想不出办法来做到这一点。有任何想法吗?我可以再次调用 JSONEncoder.encode,但现在我将运行两个 30 秒的进程,并且内存和处理器开销增加了一倍。能够取消前一个会很高兴。

编辑:你们中的一些人要求查看我的编码器。这是我要说的导致最大瓶颈的原因...

func encode(to encoder: Encoder) throws {
        try autoreleasepool {
            var container = encoder.container(keyedBy: CodingKeys.self)
            try container.encode(brush, forKey: .brush)

            if encoder.coderType == CoderType.export {
                let bezierPath = try NSKeyedUnarchiver.unarchivedObject(ofClass: UIBezierPath.self, from: beziersData)
                let jsonData = try UIBezierPathSerialization.data(with: bezierPath, options: UIBezierPathWritingOptions.ignoreDrawingProperties)
                let bezier = try? JSONDecoder().decode(DBBezier.self, from: jsonData)
                try container.encodeIfPresent(bezier, forKey: .beziersData)
            } else {
                try container.encodeIfPresent(beziersData, forKey: .beziersData)
            }
        }
    }
4

1 回答 1

1

您可以使用OperationQueue并将长时间运行的任务添加到该操作队列中。

var queue: OperationQueue?
//Initialisation
if queue == nil {
    queue = OperationQueue()
    queue?.maxConcurrentOperationCount = 1
}
queue?.addOperation {
    //Need to check the isCanceled property of the operation for stopping the ongoing execution in any case.
    self.encodeHugeJSON()
}

您也可以随时使用以下代码取消任务:

//Whenever you want to cancel the task, you can do it like this
queue?.cancelAllOperations()
queue = nil

什么是操作队列:

操作队列根据优先级和准备情况调用其排队的操作对象。将操作添加到队列后,它会一直保留在队列中,直到操作完成其任务。添加操作后,您无法直接从队列中删除操作。

参考链接:

于 2021-06-23T10:48:12.107 回答