Combine-实践

作者: YungFan | 来源:发表于2020-05-18 06:35 被阅读0次

Combine 既可以在 SwiftUI 中使用,也可以在 UIKit 中使用。下面分别实践一下。

SwiftUI

声明式UI + 响应式编程是未来移动开发的趋势,所以 Combine 对于 SwiftUI 来说是不可或缺的一部分,这也是为什么 Combine 会随着 SwiftUI 一起发布。在 SwiftUI 中任何一个 View 都可以作为 Subscriber。 SwiftUI 中的 View 协议定义了一个onReceive()的函数可以将 View 变成 Subscriber。onReceive()函数接收一个 Publisher,然后跟上一个类似于sink的闭包,可以在其中操作@State@Binding修饰的属性数据。

import SwiftUI

struct ContentView: View {
    
    @State private var currentValue = "😊"
    
    var body: some View {
        Text(currentValue)
            .onReceive(Just("SwiftUI + Combine")) { value in
                self.currentValue = value
        }
    }
}  

UIKit

虽然 SwiftUI + Combine 是一对黄金搭档,但是在 UIKit 中 Combine 也可以发挥重要作用。如下图的案例,当开关打开(关闭)的时候,按钮可以(不能)点击,点击发送通知按钮,蓝色的标签显示发送的通知内容。


实现效果
import UIKit
import Combine

extension Notification.Name{
    static var newMessage = Notification.Name("YungFan")
}

class ViewController: UIViewController {
    
    @IBOutlet weak var allowMessageSwitch: UIButton!
    @IBOutlet weak var sendButton: UIButton!
    @IBOutlet weak var messageLabel: UILabel!
    
    @Published var canSendMessage: Bool = false
    private var cancellables: Set<AnyCancellable> = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // canSendMessage的改变绑定到Button的isEnabled上
        $canSendMessage
            .receive(on: DispatchQueue.main)
            .assign(to: \.isEnabled, on: sendButton)
            .store(in: &cancellables)
        
        // 通知需要绑定到messageLabel的text
        NotificationCenter.default.publisher(for: .newMessage)
            .map{ notification -> String in
                notification.object as? String ?? ""
        }
        .assign(to: \.text, on: messageLabel)
        .store(in: &cancellables)
        
        /*
         // 上面的写法等于下面3句
        let messagePublisher = NotificationCenter.Publisher(center: .default, name: .newMessage)    
        let messageSubscriber = Subscribers.Assign(object: messageLabel, keyPath: \.text)
        messagePublisher
            .map{ notification -> String in
                notification.object as? String ?? ""
        }.subscribe(messageSubscriber)
        */
    }
    
    @IBAction func switchChanged(_ sender: UISwitch) {
        // canSendMessage的改变随开关改变
        self.canSendMessage = sender.isOn
    }
    
    @IBAction func buttonClicked(_ sender: UIButton) {
        // 发送通知
        NotificationCenter.default.post(name: .newMessage, object: "This is the \(Int.random(in: 0...100)) message")
    }
}

相关文章

  • Combine-实践

    Combine 既可以在 SwiftUI 中使用,也可以在 UIKit 中使用。下面分别实践一下。 SwiftUI...

  • Day37 流程

    一个原因/没有原因些许想法定下目标翻阅资料以史为鉴制定计划模拟演练实践实践实践实践实践实践……实践实践实践实践实践...

  • 实践实践实践

    发现自己就是想的太多,做的太少。9月份考察的一个项目,不管从哪个方面来讲,都觉得这个项目是非常好,值得一生去做的事...

  • 白玉花果的一般老化特征和老光特征,跟仿品比较

    实践出真知,但不正确的实践必不出真知。正确的实践是个人的实践和社会的实践相结合,脱离社会实践的个人实践是错误的实践...

  • 暑假工作 ‖ 社会实践报告

    实践时间:2018.07.09—2018.08.25实践人:欧阳广梅实践事件:1.社会实践(爱心传递)2.工作实践...

  • 实践实践再实践

    生命是一种体验。

  • 实践实践再实践

    这是我参加11月MJ老师的超级数字力课程的最大体验。 我作为一名复训生参加此次课程,可能因为现在是熊市,大家都不太...

  • 实践实践再实践

    猫叔的分享总是言辞恳切,每一条经验都是他实践过的,我们只要认真跟着做就行。 一、手打字录视频 有这一决定之前,我问...

  • 实践实践再实践

    记录下近来的想法,当有些想法的时候,人一下子可能会规划的很多,说要做个还有那个,然后还可以做那个,睡了一觉之后,发...

  • 实践,实践,还是实践

    王阳明说,做不到就不是真知道。 嗯嗯,我深以为然。 如果说,你知道孝敬老人是传统美德,那你...

网友评论

    本文标题:Combine-实践

    本文链接:https://www.haomeiwen.com/subject/tfuonhtx.html