2016-09-11 7 views
1

基本的に、私はチャットルームを制御するUIViewControllerを持っています。 UIViewControllerが何らかの方法でdeinitedになると、現在のユーザーはチャネルを離れる必要があります。View Controllerが登録されたときにネットワークコールを発信するのは安全ですか?

現在、私のコードは次のとおりです。

class ChatViewController: SLKTextViewController { 

    var channel: TWMChannel? = nil 

    // A ton of other code... 

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

私は今までdeinitにNSNotificationCenter.defaultCenter().removeObserver(self)のようなコードを見てきましたし、私はこれを行うには安全であるかどうかについては、オンラインで何かを発見していません。

本質的に、このビューコントローラはUINavigationControllerスタックの一部であり、ビューコントローラがポップされるたびに(deinitが常に呼び出されると思います)、チャンネルを離れるようにします。これを行うための好ましい方法がナビゲーションバーの左上のバックボタンとパンニングジェスチャーを処理する場合は、実装を見てみたいと思います。

答えて

1

deinitでこれをしないでください。で行ってください。それはあなたが言っていることです(ユーザーがその画面を離れたままになっている)、多かれ少なかれそのアプローチがうまく聞こえます。ただし、ここではchannel!.が間違っています。 channel?.を意味するので、チャンネルが設定されていないと何もせず、チャンネルが設定されていないとクラッシュすることはありません。

deinitは、一般的に呼び出されることは約束されておらず、ビューコントローラが実際に破壊されたときにのみ呼び出されます(特にスタックの一部である場合)。

+0

Rob、** 1)** 'viewController'はいつ破壊されますか? ** 2)**これは、 'viewDidLoad'が次回(破壊後)にロードされることを意味しますか? ** 3)**一般的にviewDidLoadは2回呼び出されますか? – Honey

+1

強い参照がない場合、View Controllerは破棄されます。それは多くのことに依存します。あなたは一般的にそれに頼るべきではありません。はい。viewDidLoadは、ビューをリロードするため、再度呼び出されます。ビューを構成するだけで、viewDidLoadに頼るべきではありません。オフスクリーンのときにビューコントローラが存在するとは決して考えないでください。オフスクリーンのときにView Controller *がもう存在しないと仮定しないでください。ビューを管理するビューコントローラは存在し、それ以外のものはありません。 –

+1

viewWillDisappearの問題は、ホームボタンを押しただけでも呼び出されますが、誰かがアプリケーションを開くたびに離席したり再結合したくないということです。私はビューコントローラがポップされるたびに離れることを望みます。理想的には、アプリが終了するたびに残したいと思っていますが、それは実際には実現可能ではないことがわかります。 – David

関連する問題