iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 13

30 天了解 Swift 的 Combine: [13] Operator 7. 型別銜接類型 + 8. Debug 類型

  • 分享至 

  • xImage
  •  

Operator 7. 型別銜接類型

7-1. eraseToAnyPublisher: 不是運作類型的 Operator, 是型別類型的(可能是唯一一個)

用在封裝 Publisher 並 函式化的目的, 使用型別抹除的方式, 將 中間的 Operator 抹除, 但是仍保留 Operator 的功能.

func makeTimerPublisher(time:TimeInterval) -> AnyPublisher<Date,Never> {
      return Timer.publish(every: 1, on: RunLoop.main, in: .common)
            .print()
            .eraseToAnyPublisher()
}

無 Rarbles demo!

Operator 8. Debug 類型

這類型的很簡單, 就是使用 Swift 透過 Python api 直接向 LLVM 溝通. 要注意的是: 這類型還是需要用 subscriber 才能觸發.

8-1. print: 在前面的 demo code 有出現, 將上游的任何事件打印出來, 要注意前綴參數限制是 String.

func print(_ prefix: String = "", to stream: TextOutputStream? = nil) -> Publishers.Print<Self>

多解釋無義.

8-2-1. breakpoint: 當上游發佈任何消息時. 製造 Debug 的中斷點的方法.

就像是 raise(SIGINT)!

import XCTest
let await = XCTestExpectation()
let pst = PassthroughSubject<Int,Error>()
pst
    .breakpoint()
    .print()
    .sink(receiveCompletion: {print($0)}, receiveValue: {print($0)})
    .store(in: &subscriptionSet)
pst.send(1) //Entering Debuging mode
pst.send(completion: .failure(URLError(.badURL))) 

await.fulfill()
wait(for: [await], timeout: 5)

8-2-2. breakpointOnError: 只有在上游出現 Failure 時, 進入 LLVM

import XCTest
let await = XCTestExpectation()
let pst = PassthroughSubject<Int,Error>()
pst
    .breakpointOnError()
    .print()
    .sink(receiveCompletion: {print($0)}, receiveValue: {print($0)})
    .store(in: &subscriptionSet)
pst.send(1)
pst.send(completion: .failure(URLError(.badURL))) //Entering Debuging mode

await.fulfill()
wait(for: [await], timeout: 5)

8-3. handleEvents: 介入所有上游的事件, 不會因為 RELEASE/DEBUG 的前置處理器差異, 但也不能干預下游.

func handleEvents(receiveSubscription:,
                  receiveOutput:,
                  receiveCompletion:, 
                  receiveCancel:,
                  receiveRequest:) -> Publishers.HandleEvents<Self>

很直覺的 API, 就不多做解釋了.


上一篇
30 天了解 Swift 的 Combine: [12] Operator 6. 上流整合類型
下一篇
30 天了解 Swift 的 Combine: [14] Operator 9.失敗處理類型, Operator 10. 格式解析類型
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言