iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 15

30 天了解 Swift 的 Combine: [15] Operator 10. 時間控制類型

  • 分享至 

  • xImage
  •  

與 Timer 密切使用的 Operator.

10-1. debounce: 限制連續發佈的間隔, 唯有間隔超過制定時間才會轉發元素.

var set = Set<AnyCancellable>()

func SOMESETUP() {
    UITextField()
    .publisher(for: \.text)
    .debounce(for: .microseconds(500),
              scheduler: RunLoop.main)
    .sink{print($0)}
    .store(in: &set)
}

10-2. throttle: 設定指定時間的定時器, 定時到達時將最新的元素發佈, 由lastest 決定是否發佈定時前後的元素.

var set = Set<AnyCancellable>()

Timer.publish(every: 1, on: .main, in: .common)
     .autoconnect()
     .throttle(for: .seconds(2),
               scheduler: RunLoop.main,
               latest: false)
     .sink{print($0)}
     .store(in: &set)

10-3. delay: 當上游發佈任何的事件時, 計時指定的時間後, 轉發至下游.

var set = Set<AnyCancellable>()

let start = Date()
print(start)
Timer.publish(every: 1, on: .main, in: .common)
    .autoconnect()
    .delay(for: .seconds(5),
           scheduler: RunLoop.main)
    .first()
    .sink(receiveCompletion: {completion in print(completion, Date())}){print($0)}
    .store(in: &set)
    
/* console:
00:00
00:01
finished 00:06
*/

10-4. timeout: 在掛載 Subscriber 時開始計時指定時間, 到時之前若無元素發佈, 則自動發佈結束.

嘗試使用 Timer.Publisher 模擬失敗, 用 dataTaskPublisher示範.

let session = URLSession.shared
let trueURL = URL(string: "https://apple.com")!
let m = session
        .dataTaskPublisher(for: trueURL)
        .timeout(.timeout(.microseconds(1), 
                 scheduler: RunLoop.main))
        .sink(receiveCompletion: {print($0)}, receiveValue: {print($0.count,$1.url)})
/* console
finished
*/

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

尚未有邦友留言

立即登入留言