標籤:
一般在項目中出現逆向傳值的時候就需要用到代理、block 或者通知中樞了。由於公司的項目底層封裝的很好,所以項目做了三四個月就算碰到需要逆傳的情況也不用自己處理。但是最近遇到了一個特別的情況就需要自己處理一下了,之前也在網上看了一下關於如何選擇代理、block 或者通知中樞。個人感覺代理和通知中樞都比較簡單,block稍為有點複雜。代理大家都會用,所以當時就選用了通知中樞來處理。之後有一次公司的網實在太差了,出現了逆傳資料失敗的情況,引起了我的注意,打上斷點之後才發現,通知中樞的那個方法完全沒有調用,猛然一想才記起,公司的控制器是自己寫的,在離開當前控制器的時候,已經解除綁定了,一般都是預設在銷毀的時候才去解除綁定,可能公司是全域處理在離開畫頁的時候就這樣處理了,
後面想用一下block這種看起來高檔的做法,而且也比代理寫起來簡單。其實說起block也簡單,就三步驟,定義block屬性,調用block,設定block內容。
當然代理我們用起來更簡單,因為太熟悉了,後一個控制器設定一個協議,設定一個delegate,,在前一個控制器跳轉到後一個控制器的時候,指定後一個控制器的代理為前一個控制器,然後前一個控制器遵守協議,再實現這個協議裡的方法,在這個方法裡會有後一個控制器傳過來的資料。
再理理block的順序吧。
定義block,設定block, 調用block
定義block和調用block是在一個位置的
設定block在另一個位置
那麼在哪裡定義這個block,在哪裡調用呢
要傳遞出資料的控制器的h檔案中要定義這個block屬性並且用copy,至於為什麼用copy,好像是不用copy的話,block就在棧區,過了就銷毀了,用了copy之後block就移到了堆上,就相當於對象了,大概是這個意思。
在要傳遞資料的控制器定義block屬性,然後,這個block屬性是否有控制器(另一個控制器)設定這個block。
為什麼另一個控制器要設定這個block,在要傳遞資料的控制器定義block屬性裡一般都會把要傳遞的資料,當然參數傳到block中,然後另一個控制器只有在設定這個block時,才能把這個傳遞過來的在block中的當作參數的資料,進行操作,比如設定到自己的控制項,屬性上。
傳遞資料方,定義block屬性,判斷自己的block屬性是真(有值,即被資料接收方設定把傳遞出的資料設定在自己)
資料接收方,設定這個block,把block中的參數(傳遞的資料)處理到適合的地方(控制項顯示,子控制項分發,屬性儲存再次處理)
iOS 代理與block 逆向傳值 學習