2016-04-03 14 views
0

オブザーバーを追加してビューコントローラーから削除する機能を分離したいと考えています。現在、私はviewWillAppear()メソッドでオブザーバを追加しており、viewWillDisappear()のオブザーバを削除しています。今、私はライトビューコントローラを別のクラスにこのビューコントローラからオブザーバコードを分離したいと思っています。 私は新しいクラスを作成し、このビューコントローラを新しいクラスのデリゲートとして設定する必要があると思いますが、これについてはわかりません。誰かが私にこのことを手伝うことができたら本当に感謝します。ObserverコードをViewControllerから別のクラスに変更する

答えて

2

オブザーバーとはどういう意味ですか? NSNotificationCenter?たぶん、コードスニペットではっきりさせるかもしれませんか?

FWIW ... viewWillAppear()およびviewWillDisappear()は、ビューの生涯に複数回呼び出すことができるので、そのことを念頭に置いてください。このスキャンテリオでは、バランスが取れていれば問題ありません。

通常、init/dealloc(Objc-C)またはinit/deinit(Swift)でオブザーバを追加/削除し、isViewLoadedを使用して、UIが表示されていないときにUIに触れないようにします。

あなたの実際のオブザーバーパターンについては、オブザーバーコールバックを処理するために、私は確かに新しいクラスを作り出しました。ただし、オブザーバコールバックへの応答がビューコントローラのユーザインタフェースを更新することである場合、懸念事項の分離がいくつかあります。おそらく最も良いことは、View ControllerがinitのNSNotificationCenterイベントを自動的にリッスンし、deallocで自身を削除する新しいクラスをスピンアップさせることでしょう。次に、単純な@requiredプロトコルをクラスの弱い代理人として定義します。あなたのView Controllerはこのオブジェクトを作成することができます(または、テストのためには、initで依存関係を注入する方が良い)、そのプロトコルに準拠してデリゲートとして自身を割り当てることができます。

何か本当にスマート取得するために

@protocol MyObservable { 
@required 
    -(void)myXYZEventDidOccur; 
} 

@interface MyObserver : NSObject { 

-(instancetype)initWithDelegate:(id<MyObservable>)delegate; 

} 

@interface MyObserver() 
    @property (nonatomic, weak, readwrite, nullable) id<MyObservable>delegate; 
} 

@implementation MyObserver { 

    -(instancetype)initWithDelegate:(id<MyObservable)delegate { 
     self = [super init]; 
     if(self == nil) { return nil; } 

     self.delegate = delegate; 

     [NSNotificationCentre defaultCentre] addObserver...]; 
    } 

    -(void)dealloc { 
     [NSNotificationCentre defaultCentre] removeObserver...]; 
    } 

    -(void)didReceiveNotificationXYZ:(NSNotification *)notification { 
     [self.delegate myXYZEventDidOccur]; 
    } 
} 

ようにあなたは、デリゲートを設定しているまで、あなたも観察気にすることはできません。同様に、代理人がいないときは観察をやめてください。

+1

はい、NSNotificationCenter。 viewWillAppear()またはViewWillDisappear()が呼び出されると、オブザーバが作成および割り当て解除されることを理解します。そうすることで、私が外に出たときにオブザーバのメモリを解放することができます。 ARCが有効な場合、dealloc()は使用できません。 –

+0

deallocはARCの世界ではまったく正当ですが、使用方法は微妙に変更されています。詳細は[dealloc](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/instm/NSObject/dealloc)を参照してください。基本的に、限られたリソースの管理には使用せず、superを呼び出さないでください。 – Michael

+1

viewWillDisappear()およびviewWillAppear()がコードを破損する状況を記述できますか。私はこれらのメソッドを使用してオブザーバを追加または削除することを提案したリンクをいくつか調べました。ここをクリック:[Link1](http://www.daveoncode.com/2011/12/12/quick-ios-tip-where-is-the-right-place-to-add-and-remove-observers-in -uiviewcontrollers /)、[Link2](http://stackoverflow.com/questions/10631375/whats-the-better-way-to-addobserver-removeobserver-with-nsnotificationcenter)を参照してください。 –

関連する問題