2016-09-11 8 views
1

기본적으로 chatroom을 제어하는 ​​UIViewController가 있습니다. UIViewController가 어떤 식 으로든 초기화되면 현재 사용자가 채널을 나갈 필요가 있습니다.View Controller가 deinited 될 때 네트워크 호출을하는 것이 안전합니까?

현재, 내 코드입니다 : 나는 오직 deinit에서 NSNotificationCenter.defaultCenter().removeObserver(self)과 같은 코드를 본 적이 그리고 난이 할 안전 여부에 대한 온라인 아무것도 발견하지 않았습니다

class ChatViewController: SLKTextViewController { 

    var channel: TWMChannel? = nil 

    // A ton of other code... 

    deinit { 
     channel!.leaveWithCompletion({ 
      _ in 
     }) 
    } 

.

본질적으로이보기 컨트롤러는 UINavigationController 스택의 일부이며 뷰 컨트롤러가 팝되면 (항상 deinit이 호출되는 것을 상상한다) 사용자가 채널을 나가길 원합니다. 네비게이션 바의 상단 왼쪽 뒤로 버튼과 패닝 제스처를 처리하는 기본 방법이 있다면 구현을보고 싶습니다.

답변

1

deinit에서 수행하지 마십시오. viewWillDisappear에서하십시오. 그게 당신이 말하는 것입니다 (사용자가 화면을 떠날 때 떠납니다). 그러나 channel!. 여기에 올바르지 않습니다. channel?.을 의미하므로 채널이 설정되지 않은 경우 충돌이 발생하지 않고 채널이 설정되지 않은 경우 아무 작업도 수행하지 않습니다.

deinit은 일반적으로 호출 할 것을 약속하지 않으며,보기 컨트롤러가 실제로 파괴되었을 때만 호출됩니다. 특히 예상보다 훨씬 늦을 수 있습니다 (특히 스택의 일부인 경우).

+0

Rob, ** 1) ** 언제 'viewController'가 삭제 되었습니까? ** 2) ** 'viewDidLoad'가 다음 번에 (파괴 후)로드 될 때를 의미합니까? ** 3) ** 일반적으로 viewDidLoad는 두 번 호출됩니까? – Honey

+1

보기 컨트롤러는 강력한 참조가 없을 때 파괴됩니다. 그것은 많은 것들에 달려 있습니다. 당신은 일반적으로 아무것도 그것에 의존하지 않아야합니다. 예, viewDidLoad는 뷰를 다시로드하기 때문에 다시 호출됩니다. 뷰를 구성하는 것 이외에는 viewDidLoad를 사용해서는 안됩니다. 화면이 꺼져있을 때 뷰 컨트롤러가 있다고 가정하지 마십시오. 화면 컨트롤러 일 때 뷰 컨트롤러 *가 더 이상 존재하지 않는다고 가정하지 마십시오. 뷰 컨트롤러는 뷰를 관리하기 위해 존재하며 다른 것은 없습니다. –

+1

viewWillDisappear의 문제점은 홈 버튼을 누르기 만해도 호출된다는 것입니다.하지만 누군가가 앱을 열 때마다 떠나고 다시 가입하고 싶지는 않습니다. 뷰 컨트롤러가 팝업 될 때마다 나가고 싶습니다. 이상적으로, 나는 앱이 종료 될 때마다 나가고 싶지만 실제로는 가능하지 않다는 것을 알고있다. – David