Swift Combine

Programming

Swift Combine

Reactive Programming in Swift with Combine

3 เดือนที่ผ่านมา

2 min read

What is Combine

The Combine framework provides a declarative Swift API for processing values over time. These values can represent many kinds of asynchronous events. Combine declares publishers to expose values that can change over time, and subscribers to receive those values from the publishers.

Combine framework ก็เป็น declarative API สำหรับการประมวลผลค่าตลอดเวลา หรือที่เราเรียกกันว่า Reactive Programming ให้ถึงนึกเราต้องการค่าๆนึงที่มันเป็นตลอดเวลา แล้วเราก็อยากได้ค่าเพื่อไปอัพเดใน UI เห็นภาพง่ายๆ ก็ Timer ที่นับเลขตลอดเวลา เราก็อยากได้ค่านั้นมาแสดงผล

โดย Combine มี core 3 concepts ดังนี้

Core Concepts

Publishers

Publishers เปรียบเสมือนผู้ที่คอยส่งค่าที่อัพเดทตลอดเวลา ถ้าเป็น Timer ก็จะคอยส่งค่าเวลาอันล่าสุดมาตลอดเวลา

Operators

ตัวดำเนินการ (Operators) เป็นเครื่องมือสำคัญที่ช่วยให้เราสามารถดำเนินการกับข้อมูลที่ได้รับจาก Publishers หรือผลลัพธ์ที่ได้จากการรวมหรือประมวลผลข้อมูลได้อย่างมีประสิทธิภาพ

Operators ที่ใช้ก็อย่างเช่น map, flatMap หรือ filter

Subscribers

Subscribers เป็น protocols ที่รับค่าจาก Publisher

Combine provides sink and assign subscribers as operators on the Publisher type:

  • sink(receiveCompletion:receiveValue:) จะ return closures สำหรับรับค่า และ completions
  • assign(to:on:) เมื่อ subscriber รับค่า output จะถูกเก็บในตัวแปรด้วย key-path

สามารถดูเรื่อง KeyPath

Overview

เรามาดูภาพใหญ่กันหน่อยว่า Combine มีอะไรบ้าง

https://blog.devgenius.io/combine-101-introduction-to-basics-terms-a21106cdd142
https://blog.devgenius.io/combine-101-introduction-to-basics-terms-a21106cdd142
  • Publisher จำเป็นต้องมี Subscriber เพื่อใช้งาน ให้เชื่อมต่อ Subscriber กับ Publisher
  • เมื่อเรียกใช้วิธี subscribe(_:), Subscriber จะถูกเชื่อมต่อกับ Publisher และวิธี receive ของ Subscriber จะถูกเรียกใช้
  • เมื่อวิธี receive(subscription:) ของ Subscriber ถูกเรียกใช้งาน จะทำให้ Publisher เริ่มส่งค่าองค์ประกอบที่ถูกเผยแพร่ใหม่
  • เมื่อ Publisher เสร็จสิ้นการทำงาน มันจะเรียกใช้ receive(completion:) ซึ่งสามารถสิ้นสุดการเผยแพร่ได้ด้วยข้อผิดพลาดหรือสถานะความสำเร็จ

ตัวอย่าง

import Combine
import Foundation
 
// Define a Timer publisher that emits a value every second
let publisher = Timer.publish(every: 1.0, on: .main, in: .default)
    .autoconnect()
    .map { _ in
        return Int.random(in: 1...100) // Generate a random integer
    }
 
// Define a subscriber to receive values from the publisher
let subscriber = Subscribers.Sink<Int, Never>(receiveValue: { value in
    print("Received value: \(value)")
})
 
// Subscribe the subscriber to the publisher
let cancellable = publisher.subscribe(subscriber)

Reference

Tags:

Swift