PromiseKit 解析 二 遞迴 IOS

2022-09-22 03:54:07 字數 1812 閱讀 4767

在promisekit中,裡面涉及了很多的遞迴操作,而遞迴操作,對於大部分人理解起來都是比較麻煩的(包括我),而github中一些高上大的第三方庫,無一不涉及了很漂亮的遞迴操作,因此理解遞迴操作是很必要的。如果想成為盡可能優秀的程式猿。

遞迴操作:自己呼叫自己,不停的壓棧,最後出棧。(說的簡單,但是還是理解起來還是比較複雜的)

我們來接著看看promisekit的遞迴操作,看看它的鏈式結構式怎麼樣實現的。

相信在上一章就可以了解到,then操作最後返回的是乙個新的pmkpromise,然後返回的pmkpromise例項可以再次呼叫then方法,這就是乙個鏈式結構了(如下圖)。很簡單。如果僅僅是這種遞迴,那麼就沒必要寫這篇了。

來仔細看看它內部的遞迴操作,了解它最後是如何進行這麼多then得呼叫執行的,(它不是立刻呼叫then就執行了block的函式體,而是在之後的特定情況才執行的,比如uialertview 是在點選按鈕的情況下進行執行的),還有看看它的值傳遞是如何進行的。

廢話不多說先貼**:

resolved:pending 函式裡面的

dispatch_barrier_sync(_promisequeue, ^;

}];[_handlers addobject:^(id value)];

});

和乙個pmkrsolve函式

static void pmkresolve(pmkpromise *this, id result) ;

if (ispromise(result)) ];

} else

set(nextresult);

});} else

set(result);

}

看到,set的block塊執行的操作是遍歷執行所有的儲存在_handlers的handler的block塊,還會把設定pmkresolved的result值,然後清空所有儲存的_handler的block塊。這是乙個主體的塊,能夠讓我們的then中得block合理的執行,這個在上一章節已經說過了。

下面便是乙個主體的遞迴操作了,下面看看這個遞迴的操作是怎麼樣的:

1.判斷是否 result 是 pmkresolved

2.如果不是pmkresolved,則呼叫set的block塊(引數是result)

3.如果是pmkresolved,則判斷result的nextresult,判斷它是否是pmkresolved

4.如果不是pmkresolved,則呼叫set的block塊(引數是nextresult)

5.如果是pmkresolved,則回到1

這是整個遞迴的過程,開啟整個無線迴圈的操作是2和4.

如果是uialertview例項,則直接會呼叫4的操作了。這樣就是最簡單的執行過程了。

我們想想,如果then後面接了好幾個then,那麼這個執行回事怎麼樣的,每個pmkresolved都會將他的handler執行完成,這樣每個then中得block塊就執行了,

dispatch_barrier_sync這個函式,保證了它是順序執行的。那麼它執行的順序是不是就是類似於我們一行一行**在執行乙個個then中得block塊了。至於值傳遞,我們也再上面說到了。這裡就不在強調了。

最後遞迴比較難以理解,但是認真去解讀的話還是可以的,在國外,很多高校都是以lisp或者haskell這樣的函式式語言來接觸程式設計的,有的有scheme這種語言的課程,這些語言的主要思想就是遞迴。因此遞迴還是在他們深深的腦海裡的。許多情況下遞迴效率很高,**很簡潔。但是對於我們來說還是在不熟悉的情況下少用為妙。我也嘗試學學這樣一門語言,進行下頭腦風暴。

遞迴演算法解析

和迭代差不多,只是通過定義和呼叫函式來實現迭代 把事情分解成相同的步驟重複執行直到符合某一條件時結束,再反過來遞推到最初的狀態,問題就解決了 比如定義 用的是c語言 int fun int a 在fun裡面再定義fun,這個fun都只做一件事,把a的內容和fun a 1 相乘作為返回值 這裡要有個終...

python遞迴解析JSON

知識點 1 編碼設定 特殊字元處理 2 正規表示式提取json字串 3 遞迴列印json屬性值 usr bin python coding utf 8 import os,sys,time import urllib.request,requests,bs4 import re,json,demjs...

遞迴下降法二叉樹解析

參考 編寫遞迴下降語法分析器的一般步驟 使用乙個索引來記錄當前掃瞄的位置。通常將它做成乙個整數字段。為每個非終結符編寫乙個方法。如果乙個非終結符有超過乙個的產生式,則在這個方法中對採用哪個產生式進行分支 處理單一產生式時,遇到正確終結符則將第一步建立的掃瞄索引位置向前移動 如遇到非終結符則呼叫第二步...