Combine核心概念
let stringPublisher = Just("hello, world!") let uppercasedPublisher = stringPublisher.map { $0.uppercased() }
let arrayPublisher = [1, 2, 3, 4, 5].publisher let oddPublisher = arrayPublisher.filter { $0 % 2 != 0 }
let publisher1 = Just("hello") let publisher2 = Just("world") let mergedPublisher = Publishers.Merge(publisher1, publisher2)
import UIKit import Combine class ViewController: UIViewController { @IBOutlet weak var textField: UITextField! var cancellables = Set<AnyCancellable>() override func viewDidLoad() { super.viewDidLoad() // 創建一個訂閱者,打印出文本輸入的內容 let subscriber = Subscribers.Assign(object: self.textField, keyPath: \.text) // 訂閱文本輸入框的文本變化事件 self.textField.textPublisher(for: .editingChanged) .map { $0.text ?? "" } .subscribe(subscriber) .store(in: &cancellables) } } extension UITextField { func textPublisher() -> AnyPublisher<String, Never> { NotificationCenter.default .publisher(for: UITextField.textDidChangeNotification, object: self) .map {($0.object as? UITextField)?.text ?? ""} .eraseToAnyPublisher() } }
import Combine let subject = PassthroughSubject<String, Never>() // 創建PassthroughSubject // 訂閱 let subscription = subject.sink(receiveCompletion: { _ in print("receiveCompletion") }, receiveValue: { value in print(value) }) // 發送數據 subject.send("hello") // 中途取消訂閱 subscription.cancel() // 後面發送的數據都會失敗 subject.send("world") subject.send(completion: .finished) /* 輸出: hello */
import UIKit import Combine let dataPublisher = URLSession.shared.dataTaskPublisher(for: URL(string: "https://louyu.cc")!) let cancellableSink = dataPublisher.sink { completion in switch completion { case .finished: break case .failure(let error): print("error: \(error)") break } } receiveValue: { value in print("received \(value)") } cancellableSink.cancel() //取消網絡請求