2016-12-05 3 views
0

iOS App에서 매우 이상한 충돌이 발생했습니다. 아래 함수는 일부 프로토콜의 구현이므로 일부 성공/실패 콜백을 사용하도록 선언을 변경할 수 없습니다. 그것은 입력 매개 변수를 가지고 있으며 출력에서 ​​AVAsset을 기대합니다. 내 문제는 자산을 쓰는 중입니다. 디스패치 그룹 (dg 변수)을 떠나는 동안 이상한 충돌이 발생합니다. 나는 충돌의 줄을 주석으로 표시했다. 이 충돌은 항상 발생하는 것은 아닙니다. 그냥 때때로. 이 함수는 다음과 같습니다.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 
    } 

누군가이 충돌의 원인을 알 수 있습니까? xCode의 충돌 보고서에서이 정보 만 있습니다.

+0

크래시 세부 정보가 무엇입니까 ?? –

+0

나는 그것을 가지고 있지 않다. 바로이 라인. –

+0

터미널에는이 정보 만 있습니다. (lldb) –

답변

1

당신이 디스패치 그룹에 한 번 입력 한 다음 (때때로) 루프 내부에 두 번 이상 남겨두고 균형 통화가 없기 때문에 문제가 의심됩니다. 즉. 당신은 당신이 들어오는 것보다 더 많은 시간을 떠나고 있습니다.

+0

어떻게 가능합니까? 그 동안 종료되는 중단 명령으로 인해 코드는 한 번만 차단할 수 있습니다. –

+0

이것이 원인이라고 확신하지 않습니다. 지금은 휴식을 볼 수 있기 때문에 그렇지 않을 수도 있습니다 .... 그러나 당신은 당신이 제대로 디스패치 그룹을 사용하기위한 표준 패턴을 따르고 있는지 확인하고 싶을 수도 있습니다. 디스패치 대기열 블록 완료의 일부로 휴가를 실제로 호출하지 않는다는 것을 알았습니다. 나는 당신이 사용하고있는 패턴으로 어떤 행동을 취할지는 분명하지 않다. –

+0

다른 사람이 입력 될 때마다 충돌이 발생합니까? 아니면 다른 사람이 입력되었을 때만 가끔? 나는 먼저 그것을 테스트 할 것입니다. –

0

발견 된 문제에 대한 해결책. DispatchGroup과 관련이 없지만 AVAssetWriter와 AVTimedMetadataGroup 요소의 입력 배열이 있습니다. 이 요소들 각각에는 시간 범위가 있습니다. 두 개 시작 시간이 동일하면이 그룹을 추가하는 동안 writter가 오류 상태가되고 동작이 매우 예측할 수 없습니다. 그룹을 떠나는 동안이 줄에 오류가있는 이유를 모르지만 나를위한 해결책은 같은 시작 시간을 가진 그룹을 감지하고 건너 뛰는 것이 었습니다.