官方文檔:
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