Hello ReactiveSwift(5): 調(diào)試技術(shù) ——(簡譯)

官方文檔:
http://reactivecocoa.io/reactiveswift/docs/latest/index.html
實戰(zhàn)項目:
https://github.com/JornWu/ZhiBo_Swift.git


一、整理Swift編譯器錯誤

類型推斷使編譯器難以調(diào)試會錯誤,使用類型推斷有兩個潛在的地方出錯:
1、定義類型推斷的變量
2、使用類型推斷的變量
在這兩種情況下,錯誤與關(guān)于類型的不正確假設(shè)有關(guān)。這些問題對于ReactiveCocoa應(yīng)用程序是常見的,因為它是關(guān)于數(shù)據(jù)和相關(guān)類型的操作。Swift編譯器的當(dāng)前狀態(tài)可能導(dǎo)致誤導(dǎo)類型錯誤,特別是當(dāng)信號鏈中間發(fā)生錯誤時。
以下是類型錯誤情形的示例:

SignalProducer<Int, NoError>(value:42)
    .on(value: { answer in
        return _
    })
    .startWithCompleted {
        print("Completed.")
    }

上面的代碼將不會在.startWithCompleted調(diào)用error:無法將類型'Disposable'的值轉(zhuǎn)換為閉包結(jié)果類型'()'的時候出現(xiàn)以下錯誤。要找到實際的編譯錯誤,鏈需要拆分。在每個步驟中添加關(guān)閉類型的顯式定義:

let initialProducer = SignalProducer<Int, NoError>.init(value:42)
let sideEffectProducer = initialProducer.on(value: { (answer: Int) in
    return _
})
let disposable = sideEffectProducer.startWithCompleted {
    print("Completed.")
}

上面的代碼因為存在error: cannot convert value of type '(Int) -> _' to expected argument type '((Int) -> Void)?'on閉包定義中,也不會編譯。這給出足夠的信息來定位意想不到的return _因為on結(jié)束不應(yīng)該有任何返回值。

二、調(diào)試事件流

如README所述,流調(diào)試可能相當(dāng)困難和乏味,因此我們提供logEvents操作。最簡單的形式如下:

let property = MutableProperty<String>("")
...
let searchString = property.producer
    .throttle(0.5, on: QueueScheduler.main)
    .logEvents()

這將打印到標(biāo)準(zhǔn)輸出的事件。對于大多數(shù)用例來說,這是足夠的,將極大地幫助您了解您的流程。這種方法最大的問題是它將在Release模式下繼續(xù)輸出。這里你有兩個選擇:
注釋操作://.logEvents()。這是最簡單的方法,但它很容易出錯,因為你最終會忘記這樣做。
通過你自己的功能,并按照你的看法操縱輸出。這是推薦的方法。
讓我們看看如果我們不想在Release模式下打印出來的話,

func debugLog(identifier: String, event: String, fileName: String, functionName: String, lineNumber: Int) {
   // Don't forget to set up the DEBUG symbol (http://stackoverflow.com/a/24112024/491239)
   #if DEBUG
      print(event)
   #endif
}

你會:

let property = MutableProperty<String>("")
...
let searchString = property.producer
    .throttle(0.5, on: QueueScheduler.main)
    .logEvents(logger: debugLog)

我們也提供identifier參數(shù)。當(dāng)您調(diào)試多個流并且不想丟失時,這很有用:

let property = MutableProperty<String>("")
...
let searchString = property.producer
    .throttle(0.5, on: QueueScheduler.main)
    .logEvents(identifier: "?My awesome stream ?")

還有一些情況,特別是熱信號,當(dāng)輸出太多時。對于那些,您可以指定您感興趣的事件:

let property = MutableProperty<String>("")
...
let searchString = property.producer
    .throttle(0.5, on: QueueScheduler.main)
    .logEvents(events: [.disposed]) // This will happen when `property` is released
最后編輯于
?著作權(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)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,030評論 4 61
  • 從2017年4月14日起,不再公開發(fā)布所寫文字。深感自己文采水平有限,并不能帶來高質(zhì)量文章,所以決定以后更新的文章...
    聽禪落雪閱讀 246評論 7 2
  • 今天文章的靈感來自最新特工題材美劇《柏林諜影》第一季第一集。 我個人認(rèn)為這部美劇拍得很棒,是我觀看特工題材美劇至今...
    李安迪閱讀 1,032評論 2 16
  • 轉(zhuǎn)瞬時間過去了三個月,之前的計劃有的堅持的好,有的沒有按計劃完成。此刻,坐在電腦前,我試著問自己:過去的三個月,我...
    千禾隨筆閱讀 559評論 19 43
  • 很久以來,一直有個問題,想不明白,看不明白,為什么有的人能夠自然而然的散發(fā)著很強的磁場,很有高貴的氣質(zhì),一種天...

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