2016-12-05 4 views
0

Ich habe sehr seltsame Absturz von iOS App erlebt. Die folgende Funktion ist eine Implementierung eines Protokolls, so dass ich ihre Deklaration nicht ändern kann, um einen Erfolgs-/Fehler-Callback zu verwenden. Es hat Eingabeparameter und erwartet AVAsset am Ausgang. Mein Problem ist während des Schreibens des Assets. Ich bekomme merkwürdige Abstürze beim Verlassen der Dispatch-Gruppe (Variable dg). Ich habe die Linie des Absturzes mit Kommentar markiert. Dieser Absturz ist nicht immer passiert. Nur von Zeit zu Zeit. Dies ist die Funktion:Seltsames Verhalten der Dispatch Group

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 
    } 

Kann jemand eine Idee haben, was ist die Ursache für diesen Absturz? Ich habe nur diese Informationen von Absturzbericht in xCode.

+0

Was ist das Crash-Detail? –

+0

Ich habe es nicht. Nur diese Linie. –

+0

Im Terminal habe ich nur diese Information: (lldb) –

Antwort

1

Ich vermute, dass Ihr Problem darin besteht, dass Sie keine ausgewogenen Anrufe haben, da Sie die Dispatch-Gruppe einmal eingeben und dann (manchmal) mehrmals in der Schleife verlassen. dh. Du rufst öfter an, als du angerufen hast.

+0

zu reproduzieren Wie ist das möglich? Der Code kann nur einmal eingeben wegen der Pause-Anweisung, die während beendet wird. –

+0

Ich bin mir nicht sicher, dass das der Grund ist. Jetzt sehe ich, dass es möglicherweise nicht ist, weil ich die Pause jetzt sehe .... aber Sie möchten vielleicht überprüfen, ob Sie dem Standardmuster für die Verwendung der Versandgruppe ordnungsgemäß folgen. Ich sehe, dass Sie als Teil der Vervollständigung für einen Dispatch-Warteschlangen-Block nicht wirklich "Leave" aufrufen. Ich bin nicht klar, welches Verhalten Sie mit dem Muster, das Sie verwenden, bekommen werden. –

+0

Tritt der Absturz jedes Mal auf, wenn der else eingegeben wird? Oder nur manchmal wenn der else eingegeben wird? Ich würde das zuerst testen –

0

Gefundene Lösung für das Problem. Es war nicht mit DispatchGroup verbunden, sondern mit AVAssetWriter und einem Eingabearray von AVTimedMetadataGroup-Elementen. Jedes dieser Elemente hat einen Zeitbereich. Wenn die Startzeit für zwei von ihnen identisch ist, dann wird Writer während des Anhängens dieser Gruppen in einem Fehlerzustand sein und das Verhalten ist sehr unberechenbar. Ich weiß nicht, warum der Fehler in dieser Zeile während des Verlassens der Gruppe war, aber die Lösung für mich bestand darin, Gruppen mit denselben Startzeiten zu erkennen und sie zu überspringen.