最簡單的仿RXSwift小工具

class ChainObjc: NSObject {
    
    public typealias NextBlock = (_ result: Bool) -> Void
    
    fileprivate var next: NextBlock?
    fileprivate var nextObj: ChainObjc?
    fileprivate var tempBlock: ((_ :NextBlock?) -> ())?
    fileprivate var hasNext: Bool = false
    fileprivate var tempObj: ChainObjc?
    
    @discardableResult
    func handle(_ isNow: Bool = false,completBlock:((_ :NextBlock?) -> ())?) -> ChainObjc {
        tempObj = self//通過循環(huán)引用,減少外部的強引用操作
        tempBlock = completBlock
        self.next = {[weak self](hasNext) in
            if hasNext {
                if self?.nextObj?.tempBlock == nil {
                    self?.nextObj?.hasNext = true
                }
                self?.nextObj?.tempBlock?(self?.nextObj?.next)
            }
            self?.tempObj = nil
        }
        
        let temp = ChainObjc()
        self.nextObj = temp
        defer {
            if isNow || hasNext {
                tempBlock?(next)
            }
        }
        return temp
    }
    
    deinit {
        print("---------dealloc")
    }
}


//調(diào)用api

ChainObjc().handle(true ,completBlock: { (nextBlock) in
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                print("---------1")
                nextBlock?(true)
            }
        }).handle(completBlock: { (nextBlock) in
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                print("---------2")
                nextBlock?(true)
            }
        }).handle(completBlock: { (nextBlock) in
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                print("---------3")
                nextBlock?(true)
            }
        })

總結(jié):RXSwift和RAC核心就是block套block,感覺沒必要寫那么復(fù)雜,面向Api開發(fā),只要實現(xiàn)這種責(zé)任鏈的條用就夠了,對于一些其他的需求,比如說是否忽略中間next,直接調(diào)用成功或者失敗,等,可以自己擴展

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前幾個月一直在學(xué)習(xí)RxSwift,確實相當(dāng)酷的一個開源庫,受益匪淺。在未來學(xué)習(xí)swift版本(ReactiveSw...
    王琦_7a23閱讀 5,486評論 3 20
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實如果沒有APIManager這一層是沒法使用delegate的,畢竟多個單...
    yhtang閱讀 5,466評論 1 23
  • MVC Cocoa 的 MVC 模式驅(qū)使人們寫出臃腫的視圖控制器,因為它們經(jīng)常被混雜到 View 的生命周期中,因...
    MichaelLedger閱讀 1,119評論 0 5
  • 表情是什么,我認為表情就是表現(xiàn)出來的情緒。表情可以傳達很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,448評論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險,但是人生放棄了冒險,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 7,577評論 0 4

友情鏈接更多精彩內(nèi)容