我遇到了来自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/

10-12 23:16