2016-04-06 11 views
0

私は、特定のイベントをトリガーするカスタムデリゲートを持っています。コンテキストの場合、イベントを任意に発生させるのはBluetoothデバイスです。私は、デバイスの代理人によってトリガされるこれらのイベントに、オプションでサブスクライブするビューコントローラを希望します。イベントをグローバルに委任するにはどうすればよいですか?

各ビューコントローラがカスタムデリゲートに準拠しているとは限りません。これは、デバイス変数がローカルであり、そのビューコントローラでのみ起動することを意味するためです。他のView Controllerは変更を認識しません。もう1つの具体的な例はCLLocationManagerDelegateです - たとえば、すべてのビューコントローラがGPS座標の変更を聞きたい場合はどうすればいいですか?

代わりに、私は、すべてのビューコントローラが購読できるグローバルデリゲートをもっと考えていました。したがって、1つのビューコントローラが要求をトリガすると、デバイスはリスンしているすべてのサブスクライブされたビューコントローラに対してデリゲート関数を呼び出します。

このアーキテクチャ設計をどのように達成できますか?代議員は適切なアプローチではないのですか?私は多分NotificationCenterがここで助けることができると思ったが、あまりにも緩くタイプされたように見えるかもしれない。どんな助けでも大歓迎です!

答えて

1

通知を受け取るサブスクライバの配列を持つことができます。

class CustomNotifier { 

    private var targets : [AnyObject] = [AnyObject]() 
    private var actions : [Selector] = [Selector]() 


    func addGlobalEventTarget(target: AnyObject, action: Selector) { 

     targets.append(target) 
     actions.append(action) 
    } 

    private func notifyEveryone() { 

     for index in 0 ..< targets.count { 

      if targets[index].respondsToSelector(actions[index]) { 

       targets[index].performSelector(actions[index]) 
      } 
     } 
    } 
} 

当然、あなたはtargetsactionsのライフサイクルを維持するために、さらに計画する必要があり、かつ退会する方法を提供したいなど

注:ターゲットとアクションの配列のためになる。また、理想的なオブジェクトはweakです。 This SO questionは、例えば、対象を扱う。

0

NotificationCenterは、最初に考えられる解決策です。はい、それは緩く型付けされています。しかし、あなたはそれを改善することができます。このような例:

extension NSNotificationCenter { 

    private let myCustomNotification = "MyCustomNotification" 

    func postMyCustomNotification() { 
     postNotification(myCustomNotification) 
    } 

    func addMyCustomNotificationObserverUsingBlock(block:() ->()) -> NSObjectProtocol { 
     return addObserverForName(myCustomNotification, object: nil, queue: nil) { _ in 
      block() 
     } 
    } 

} 

第二ソリューション•すべての代表者またはブロック/クロージャを保存し、必要なときにそれらをトリガーするいくつかの共有オブジェクトを作成することです。このようなオブジェクトは基本的にはNotificationCenterを使用するのと同じですが、より多くの制御を与えます。

関連する問題