我遇到了来自iOS App的非常奇怪的崩溃。下面的函数是某些协议的实现,因此我无法更改其声明以使用某些成功/失败回调。它具有输入参数,并期望在输出端使用AVAsset。我的问题是在编写资产期间,在离开调度组(dg变量)期间遇到奇怪的崩溃。我用注释标记了崩溃行。这种崩溃并非总是会发生。只是不时。这是功能:
func writeAsset(to url: URL, metadataArray: [AVTimedMetadataGroup]) -> AVAsset {
let writer = try! AVAssetWriter(url: url, fileType: AVFileTypeQuickTimeMovie)
writer.movieTimeScale = track.timeScale
// setup writer, inputs and metadata adaptor and so on ...
if writer.startWriting() {
writer.startSession(atSourceTime: kCMTimeZero)
}
let writeQueue = DispatchQueue(label: "HH.Write.Track.Queue")
let dg = DispatchGroup()
var i = 0
dg.enter() // Entering to the group
writerMetadataIn.requestMediaDataWhenReady(on: writeQueue) {
while writerMetadataIn.isReadyForMoreMediaData {
//let group = ..fetch next group to write
if i < metadataArray.count {
let group = metadataArray[i]
if writerMetadataAdaptor.append(group) {
}
i += 1
} else {
writerMetadataIn.markAsFinished()
writer.finishWriting {
dg.leave() // CRASH IN THIS LINE
}
break
}
}
}
dg.wait()
let writtenAsset = AVAsset(url: url)
return writtenAsset
}
有人可以知道导致崩溃的原因是什么吗?我只有来自xCode中崩溃报告的信息。
最佳答案
我怀疑您的问题是,由于您一次进入了调度组,然后(有时)在循环中多次(多次)将其离开,因此您没有均衡的呼叫。即。您打电话请假的时间比打电话回车的时间还多。
关于ios - 调度组的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40981013/