iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

30 天了解 Swift 的 Combine系列 第 26

30 天了解 Swift 的 Combine: [26] GitHub repo 介紹: CombineDataSource

  • 分享至 

  • xImage
  •  

CombineDataSource 是一個在 GitHub 現有的第三方函式庫, 將 TableView 的DataSources 很有趣的與 Combine 結合在一起,作者 Marin Todorov 有許多關於 Swift 的教學與書籍,其中包含在知名教學網 raywenderlich 的 Combine: Asynchronous Programming with Swift

CombineDataSources

使用 Day 24 的 SPM 方法,將 https://github.com/combineopensource/CombineDataSources 加入 CombineLoggin 專案。

預備動作(Button 與 Data)

  1. 加入 Button.publisher 的響應宣告。
  override func viewDidLoad() {
        super.viewDidLoad()
        ...
        loginButton.publisher(for: .touchUpInside)
            .sink { (_) in
                self.passwordTextField.text = ""
                let now = Date().description
                self.setting.logginDate.append(now)
                /*
                let vc = ListViewConcroller()
                vc.resourcePublisher = Just(self.setting.logginDate)
                /*
                self.present(vc, animated: true)
        }.store(in: &set)
    }
  1. 在 Setting 建立TableView 的資料來源

class Setting {
    ...
    @UserDefault("logginDate", defaultValue: []) var logginDate:[String]
    var logginDatePublisher:Just<[String]>{Just(self.logginDate)}
}

建立TableView 與 使用 CombineDataSources

import CombineDataSources

class ListViewConcroller: UIViewController,Storyboarded {
    
    @IBOutlet weak var tableView: UITableView!
    
    var resourcePublisher : Just<[String]>!
    var set = Set<AnyCancellable>()
    override func viewDidLoad() {
        super.viewDidLoad()
        // 1
        let subscriber:AnySubscriber<[String],Never> = tableView
            .rowsSubscriber(cellIdentifier: "Cell",
                            cellType: UITableViewCell.self) { (cell, indexPath, model) in
                                cell.textLabel?.text = model
        }
        // 2
        resourcePublisher.bind(subscriber: sub).store(in: &set)
    }
}
  1. 使用 subscriber 的方式,將綁定預先設定
  2. 將 Publisher 的綁定目標給予 Subscriber

完成 Button 的畫面傳遞

loginButton.publisher(for: .touchUpInside)
        .sink { (_) in
            self.passwordTextField.text = ""
            let now = Date().description
            self.setting.logginDate.append(now)
            let vc = ListViewConcroller.instantiate()
            vc.resourcePublisher = self.setting.logginDatePublisher
            self.present(vc, animated: true, completion: nil)
    }.store(in: &set)

成果:

Source Code 於 https://github.com/ytyubox/CombineLoggin


上一篇
30 天了解 Swift 的 Combine: [25] 好文分享 從零打造基本版 Combine
下一篇
30 天了解 Swift 的 Combine: [27] 好書介紹 Combine: Asynchronous Programming with Swift
系列文
30 天了解 Swift 的 Combine30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言