iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 14

30 天了解 Swift 的 Combine: [14] Operator 9.失敗處理類型, Operator 10. 格式解析類型

  • 分享至 

  • xImage
  •  

今天這部分很適合用 URLSession.datataskPublisher 介紹

Operator 9. 失敗處理類型

9-1. assertNoFailure: 就像 assert() 一樣,不會影響上線運作。

let pts = PassthroughSubject<Int, URLError>()
pts
    .assertNoFailure()
    .sink{_ in}
pts.send(1)
pts.send(completion: .failure(.init(.badURL))) // asserting here

9-2. catch: 與 try catch 一樣,是作為錯誤處理的常用方法,不同的是,可以回傳其他的上游作為替代。

某個角度看的話,是不是很像map!?

let session = URLSession.shared
let wrongURL = URL(string: "https://apple.c")!
let trueURL = URL(string: "https://apple.com")!
let m = session
        .dataTaskPublisher(for: wrongURL)
        .catch{ _ in
            return session.dataTaskPublisher(for: trueURL)
        }.sink(receiveCompletion: {print($0)}, receiveValue: {print($0.count,$1.url)})
        
/* console
60596 https://www.apple.com/
finished
*/

9-3. retry: 當上游發佈失敗時, 重複指定次數的重試.

目前還找不到 retry with delay 的方法, 找到更新.

let session = URLSession.shared
let wrongURL = URL(string: "https://apple.c")!
let trueURL = URL(string: "https://apple.com")!
let m = session
        .dataTaskPublisher(for: wrongURL)
        .retry(1)  /// <----------- 嘗試重試上游 n 次, 後繼續下游
        .catch{ _ in
            return session.dataTaskPublisher(for: trueURL)
        }.sink(receiveCompletion: {print($0)}, receiveValue: {print($0.count,$1.url)})

Operator 10. 格式解析類型

10-1. decode: 將上游的 Data 元素轉化成 Decodable 型別.

要先轉化上游元素成 Data (Output)

let session = URLSession.shared
let trueURL = URL(string: "https://apple.com")!
let m = session
        .dataTaskPublisher(for: trueURL)
        .map{d,r in #""1""#.data(using: .utf8)!}
        .decode(type: String.self, decoder: JSONDecoder())
        .sink(receiveCompletion: {print($0)}, receiveValue: {print($0)})

/* console:
1
finished
*/

上一篇
30 天了解 Swift 的 Combine: [13] Operator 7. 型別銜接類型 + 8. Debug 類型
下一篇
30 天了解 Swift 的 Combine: [15] Operator 10. 時間控制類型
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言