2012-04-25 56 views
3

我讀過一個對象一次只能有一個委託。 但這是真的嗎?爲什麼只有一個代表?

比方說,我使用協議創建對象,並從該對象中收集大量其他對象的數據。我將符合我的協議的每個對象添加到數組中。然後,我只需循環它並在每個代理上調用我的方法。

NSMutableArray *collectFromDelegates = [NSMutableArray alloc]init]; 

//in delegateArray I keep pointers to every delegate. 
for(id delegate in delegateArray){ 
    [collectFromDelegates addObject:[delegate someProtocolMethod]]; 
} 

這是錯誤的嗎?

回答

9

這不是真的delegation

委派是一種簡單且強大的模式,其中程序中的一個對象代表另一個對象或與另一個對象協調工作。委託對象保持對其他對象(委託)的引用,並在適當的時候向其發送消息。該消息通知代理事件委託對象即將處理或剛剛處理。

讓多個對象處理一個事件對你來說沒有什麼意義,因爲它已經被處理了。我可以看到有多個委託的唯一原因是如果第一個處理事件失敗,它可以傳遞給下一個,直到某個對象處理它。

在您的示例中,對象充當數據源。這比多個委託更有意義,但可以通過讓單個數據源合併來自多個對象的數據來輕鬆實現,這意味着請求數據的對象不必擔心如何組合它。

另一種情況下,您經常需要多個對象正在接收事件的通知。這不是委派,因爲對象不是爲對象工作的,只是作用於發生在對象上的事情。這通過使用通知或觀察更好地實現。

0

一般來說,當您想要發送多個對您的課程感興趣的課程時,您可以使用NSNotification s。但是,這將不允許他們返回數據,除非您允許他們發送消息給通知的object。我不確定這是否會是一個更清潔的解決方案。

1

蘋果的慣例是隻有一個「委託」對象。但是,如果這是您所需要的,您可以設置自己的班級以擁有一組委託人。爲了清晰起見,您可能想給他們打電話。

在您的示例中,將它們稱爲「dataSources」可能更合適。

1

委託只是一個抽象的概念 - 您可以擁有儘可能多的代表。但是,這很少需要,通常也是一個不好的模式。

蘋果很好地使用了sourcedelegate模式。源ivars(一種委託形式)提供數據,而委託ivars則被調用以獲得邏輯響應。也許這是一個更好的解決方案?

或者,您可以使用NSNotification通知許多聽衆一個事件。

希望這會有所幫助!

0

旁邊提到的Notifications的一種方法可能是,您的委託實現包含一個符合協議的對象數組,並將此協議方法作爲包裝調用。

1

一個類只有真正需要一個代表,如果你有多個代表你正在解決一個不同的問題。委託模式用於修改類的行爲。比如說我們有一個可以吠叫的狗類,但是不同類型的狗以不同的方式吠叫。代表將是改變吠叫行爲的一種方式。

如果您需要一個以上,您可能更感興趣的觀察您的班級正在做什麼,它需要通知其他人當前的活動。由於其他幾個類可能對一個類的行爲感興趣,因此您需要一個數組。在iOS SDK中,這已經通過通知完成了。這被稱爲觀察者模式。

不同的使用情況......

1

我讀過一個對象一次只能有一個委託。但事實確實如此?

你從哪裏讀到的?不,這不是真的。例如,UITableView有兩個代表,一個代表提供數據,另一個代表處理操作。

相關問題