<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Swift Combine 基本學習與使用

      Combine基本認知

       

      Combine 是基于泛型實現的,是類型安全的。它可以無縫地接入已有的工程,用來處理現有的 Target/Action、Notification、KVO、callback/closure 以及各種異步網絡請求。

      Combine 是基于觀察者模式,響應式編程的編程思想

       

      觀察者模式: 一種設計模式,用來描述一對多關系:一個對象發生改變時將自動通知其他對象,其他對象將相應做出反應。

      觀察者設計模式特點:觀察者之間彼此時互相獨立的,也并不知道對方的存在。

       

      響應式編程(Reactive Programming)是一種編程思想

      響應式編程的核心:是面向異步數據流和變化的

      在實際開發的過程中,面對紛繁復雜的用戶交互,觸發事件,網絡交互,系統通知,響應式編程幫助我們把事件處理成為異步的數據流,我們只需要監聽所關心的數據流的變化,按需做出相應即可

       

      在 Combine 中,有幾個重要的組成部分:

      • 發布者:Publiser :  觀察者模式中被監聽的對象
      • 訂閱者:Subscriber :監聽者
      • 操作符:Operator: publiser通過各種各樣的操作符把不相關的邏輯編程一致的(unified)、聲明式的(declarative)的數據流

      舉例使用

      一 @Published

        @Published var foo:String = "test" //@Published是Combine的修飾屬性,標識這是個被觀察的對象 即發布者 
        let subscription = $foo.sink { print("foo is \($0)") }//發布者通過 sink 訂閱 Publisher 事件
      foo
      = "\(indexPath.row)" //發布者對象發生變化時候 Subscriber 監聽到就會執行 sink

      //?? 如果發現只執行了一次監聽 或者 無法監聽 是因為Subscriber 訂閱者訂閱的數據流的作用域問題,可考慮把發布者或者訂閱者設計為實例變量持有即可

      二  PassthroughSubject

      PassthroughSubject 發布者:狀態管理外部數據監聽
      //創建一個實際的傳遞主題實例 默認初始化器
       let passThroughSubject = PassthroughSubject<String, Error>()
      //先訂閱
              let subscription = passThroughSubject.sink(
                          receiveCompletion: { completion in
                              print("Received completion (sink)", completion)
                      },
                          receiveValue: { value in
                              print("Received value (sink)", value)
                          }).store(in: &cancellables)
      //??如果沒有store 方法 只執行一次,需要把訂閱者存住The set in which to store this ``AnyCancellable``.
      //后接收            
      passThroughSubject.send("Hello1 ") passThroughSubject.send("Hello2”)

      三 異步參考Future

      let downloadPublisher =  Future<Data?, Error> { promise in
                  URLSession.shared.dataTask(with: URL.init(string: "https:www.1")!) { ( data, response, error) in
                      if (data != nil) && error == nil {
                          promise(.success(data))
                      } else {
                          promise(.failure(error!))
                      }
                  }.resume()
              }
              
              let cancellable = downloadPublisher.sink { (result) in
                  switch result {
                  case .failure(let error):
                      Log(error.localizedDescription)
                  default: break
                  }
              } receiveValue: {  value in
                  print("Received value (sink)", value)
              }.store(in: &cancellables)

      //需要取消監聽
      cancellable.cancel()


        

      參考

      1 https://www.jianshu.com/p/df8535b40079

      2 https://icodesign.me/posts/swift-combine/

      3 https://blog.csdn.net/iCloudEnd/article/details/106252106

       

      posted on 2021-03-24 11:50  ACM_Someone like you  閱讀(1312)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: av 日韩 人妻 黑人 综合 无码| 久久精品国产成人午夜福利| 日韩精品卡一卡二卡三卡四| 国语精品一区二区三区| 成人午夜福利精品一区二区| 国产中文字幕在线一区| 庆阳市| 人妻精品无码一区二区三区| 亚洲欧美日韩成人综合一区| 一区二区三区鲁丝不卡| 亚洲色婷婷一区二区三区| 人妻蜜臀久久av不卡| 国产偷国产偷亚洲清高网站| 久久丫精品久久丫| 国产欧美综合在线观看第十页| 性久久久久久| 国产老熟女一区二区三区| 国产一区二区高清不卡| 临夏县| 欧美大胆老熟妇乱子伦视频| 国产亚洲精品VA片在线播放| 国产三级精品福利久久| 老熟妇国产一区二区三区| 日本一卡2卡3卡四卡精品网站| 亚洲精品一区二区三区小| 国产一精品一av一免费| 中文字幕成人精品久久不卡 | 国产午夜精品久久一二区| 国产麻花豆剧传媒精品mv在线| 国产色悠悠在线免费观看| 久久久这里只有精品10| 国产一区二区高清不卡| 99午夜精品亚洲一区二区| 在线精品视频一区二区三四| 国产精品国产三级国产av剧情| 欧美国产综合欧美视频| 熟女系列丰满熟妇AV| 思思久99久女女精品| 国产大片黄在线观看| 亚洲AV无码破坏版在线观看| 在线涩涩免费观看国产精品|