2016-04-06 90 views
0

我有一個觸發特定事件的自定義委託。對於上下文來說,這是一個任意觸發事件的藍牙設備。我希望我的視圖控制器可以選擇訂閱由設備代理觸發的這些事件。如何訂閱全球委託事件?

每個視圖控制器都符合自定義委託是沒有意義的,因爲這意味着設備變量將是本地的,並且只會在該視圖控制器中觸發。其他視圖控制器不會意識到更改。另一個具體的例子是CLLocationManagerDelegate - 例如,如果我想要所有的視圖控制器聽GPS座標變化怎麼辦?

相反,我想更多的是所有視圖控制器都可以訂閱的全局委託。所以如果一個視圖控制器觸發一個請求,設備將爲所有正在偵聽的訂閱視圖控制器調用委託函數。

我該如何實現這種建築設計?代表是不是正確的方法?我想也許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一樣,但是給你更多的控制。