2017-10-21 11 views
0

이전보기 컨트롤러로 다시 전환 한 후 내 앱이 작동하지 않는 이상한 동작이 있습니다. 디스플레이 프로필 컨트롤러가 있고 프로필 컨트롤러를 편집합니다. EXC_BREAKPOINT (코드 = 1, 서브 코드 = 0x1026eb43c)DispatchSourceTimer가 segue에서 오류없이 앱을 종료합니다.

I : 나는 오류없이 단지

Thread1 1 초 나중에 응용 프로그램 충돌 내 이전보기 컨트롤러로 돌아가 다음이 오디오 파일을 녹음 녹음하는 동안보기에 카운터를 추가 할 수 있도록 DispatchSourceTimer를 사용하여 오디오를 녹음하고 난 전역 변수 이런 식으로 초기화 : 여기

var nonObservalePropertyUpdateTimes:DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main) 

을 그리고 난라는 Singltone 클래스를 사용하여 녹음을 어떻게210 :

@IBAction func micButtonTapped(_ sender: UIButton) { 

    if recButtonIsChecked { 

     if AudioManager.shared.record(fileName: "recbio") { 

     sender.setBackgroundImage(UIImage(), for: .normal) 
     sender.setImage(#imageLiteral(resourceName: "pauseProfileButton"), for: .normal) 
     playRecordButton.setBackgroundImage(#imageLiteral(resourceName: "editProfilePlay"), for: .normal) 
     recordVoiceLabel.isHidden = true 
     recButtonIsChecked = false 
     secondsLabel.isHidden = false 

     nonObservalePropertyUpdateTimes.resume() 

     } 


    nonObservalePropertyUpdateTimes.setEventHandler {[weak self] in 

     self?.secondsLabel.text = String(describing: AudioManager.shared.countDownTimer) 

    } 

    nonObservalePropertyUpdateTimes.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.milliseconds(100)) 

    } else { 
     sender.setBackgroundImage(#imageLiteral(resourceName: "editProfileMicButton"), for: .normal) 
     sender.setImage(UIImage(), for: .normal) 
     recButtonIsChecked = true 
     stopRecording() 

    } 

} 

내가 뭘 생각하는 것은 내가 내 편집 프로필보기 컨트롤러에서 nonObservalePropertyUpdateTimes 개체를 제거 할 때 내가 다시 SEGUE 때 응용 프로그램이 충돌하지 않았기 때문에 뭔가 잘못된 해프닝이 충돌의 원인이되는 DispatchQueue에 있다는 것입니다 내 프로필보기 컨트롤러에.

그래서 나는이 작업을 수행하려하지만 도움이되지 않습니다

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    nonObservalePropertyUpdateTimes.suspend() 
    nonObservalePropertyUpdateTimes.cancel() 

} 

을 아니면 deinit이 파견 객체에 대한 방법이있다. 나는 무엇이 잘못되었는지, 무엇을해야 할지를 정말로 모른다. 심지어 적절한 오류 메시지가 없습니다. 메인 쓰레드 내에서 실행

+0

나는 'AudioManager.shared.countDownTimer'를 의심하여 ​​시작할 것입니다. 이 코드에 무엇이 있는지는 명확하지 않습니다. 하지만 그걸 제거하고, 텍스트를'Date()'또는 유사하게 설정함으로써 문제가되는지 탐색 할 수 있습니다. –

+0

countDownTimer는 15로 시작하는 Int 변수이며 AudioManager 클래스의 타이머를 사용하여 1 초마다 카운트 다운합니다. 내가 말했듯이 녹음 부분은 잘 작동하고 모든 것이 괜찮습니다. 문제는 디스패치에 있습니다. 왜냐하면 디스패치없이 레코딩 할 때 "물론 내 라벨이 업데이트되지 않습니다"하지만 내 프로필보기 컨트롤러로 다시 갈 때 충돌이 발생하지 않기 때문입니다. 때문에 DispatchSourceTimer의 인스턴스를 초기화합니다. –

+0

다음으로 'DispatchSourceTimer'를'NSTimer'에 대해 바꿔 넣을 것입니다. 그러면 문제가 'DispatchSource'에 있는지 알려줍니다. –

답변

0

확인합니다 UI 활동 :

DispatchQueue.main.async { 
self?.secondsLabel.text = String(describing: AudioManager.shared.countDownTimer) 

} 
+0

할 일이 없습니다. 내가 질문에 추가 한 DispatchSourceTimer 개체 초기화 코드를 읽으면 주 대기열에 디스패치됩니다. –

1

감사 특별 롭을 돕기 위해 노력 온몸. DispatchSourceTimer를이 방법으로 초기화하지 않았으므로 더 이상 작동하지 않습니다.

deinit { 
    nonObservalePropertyUpdateTimes.resume() 
}