2017-02-10 21 views
0

我對這種設計模式非常困惑,我相信我目前沒有得到所有要點。爲什麼不通過視圖之間的2段傳遞消息,而是通過segue和deletation

讓我們把一個簡單的場景在這裏:

兩種觀點,說A和B,數據通過賽格瑞傳遞從A到B,但B時要傳遞的數據回A或更改/更新一些數據屬於A的數據源,這裏使用委託! 爲什麼不只是讓2 segues,讓他們通過數據

我的理解是

Segue公司是「硬」的連接,控制器A通過建立一個SEGUE到控制器B連接意味着它必須知道控制器B,因此,A是保留提及B.另一方面,代理是從B到A的「丟失」連接,所以B對A不太瞭解。結果A到B是「硬」連接,B到A是「丟失」連接,這可以避免內存泄漏問題。

問題1:我的理解中是否有任何錯誤?

Question2:是否有任何其他原因使用segue和委託模式?

問題3:如果委託非常好,爲什麼不使用2委託進行所有數據傳遞和消息傳遞?

非常感謝您的時間和幫助

+1

塞格斯不是關於傳遞數據,它們是關於表示視圖控制器。有時您必須將數據傳遞到目標視圖控制器作爲該進程的一部分,但這不是您使用segue的原因。 – dan

+0

@丹感謝丹,我想我誤解了SEGUE使用 – SLN

回答

1

是任何有在我的理解錯誤?

您的建議segue假定硬連接不準確。人們可以構建一個在接收端進行協議實現的segue,而不是一個特定的類。這是完全合法的,並使您的代碼更加靈活。

是否有任何其他原因使用segue和委託模式?

按照設計,segue API不是對稱的:發送方在segue即將觸發時收到通知,但接收方只是被打開。因此,發送者的任務是將需要的任何內容傳遞給接收者,以建立與發送者進行通信的方式。

如果委託是那麼好,爲什麼不使用2名代表所有的數據傳遞和信息?

你完全可以使用委託進行雙方通信。但是,API的不對稱使得不必使用第一個委託。

+0

非常感謝您的幫助和解釋 – SLN

1

問題1:是否有任何在我的理解錯誤?

不,這是正確的大部分時間。

問題3:如果委託非常好,爲什麼不使用2個委託進行所有數據傳遞和消息傳遞? ]

TL的好問題; DR答案:兩個對象中的一個必須保留另一個,這樣做更容易和更有意義。


讓我們繼續僅約ViewControllers說話,即使過程可能是真的用任何物體...... 父視圖控制器必須知道孩子。邏輯對父母來說很重要,它需要知道哪個孩子要調用哪個動作。

孩子不必在意它的呈現方式,它可以在一個容器視圖,在推導航控制器,模態呈現......這不費心。但是,如果它想與來電者溝通,無論是誰,使用授權都是有道理的。

您可能有一個雙重委託,但您需要一箇中間對象,作爲兩個控制器的委託,有責任在正確的控制器上傳遞正確的消息。而且,這兩個對象都必須保留在某個地方。可能會導致一些有用的情況,但大多數情況下只有一個強有力的依賴就足夠了。

此外,您不要使用委派。例如,你可以對ChildViewController一個parentViewController屬性,你會設置這樣的屬性在父的prepareForSegue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let childVC = segue.destination as! ChildViewController 
     childVC.parentVC = self 
    } 
} 

但現在你將有一個強耦合,這意味着:

  • 潛在的保留週期(如孩子也保留了父母),你要想想父母設置爲weak
  • 少的可重用性的子視圖,因爲它需要一個非常具體的父母。
+0

非常感謝您的詳細解釋 – SLN

相關問題