Merhabalar bu yazımda Swift ile iOS uygulamalarınızda kullanabileceğiniz Asenkron işlemler yapmanızı sağlayan Combine kütüphanesi yazılarına devam ediyoruz.
Bu kütüphanenin bilinmesi gereken en önemli temel yapısı publish ve subscribe yapısıdır. Mantık olarak yayıncı ve abone vardır. Yayıncı veriyi yayınlar ve abonede bu veriyi alır okur, filtreler, operatörler yardımı ile dilediğini yapar.
Combine = Publishers + Subscribers + Operators
Publisher yapısını aşağıda görebilirsiniz.
protocol Publisher { associatedtype Output associatedtype Failure : Error func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input }
Çıkış, hata ve subscribe bağlantısı için fonksiyona sahiptir.
Subscribe yapısıda bu yapıya benzerdir ancak orda Girdi değişkeni mevcuttur.
public protocol Subscriber : CustomCombineIdentifierConvertible { associatedtype Input associatedtype Failure : Error func receive(subscription: Subscription) func receive(_ input: Self.Input) -> Subscribers.Demand func receive(completion: Subscribers.Completion<Self.Failure>) }
Combine yapısında Subscribe işlemi için 2 adet fonksiyon bulunur.
- sink(receiveCompletion:receiveValue:) – (Hata ayıklama, publisherden gelen data, işlem sonucu elde etme vs)
- assign(to:on:) – (Bir özelliği yeni elamana yazmak için kullanılır)
Aşağıda yazdığım örnekleri inceleyebilirsiniz.
let publisher = Just("Kenan Atmaca") let subscriber = publisher.sink { (val) in print(val) }
let publisher = [1,2,66,33,72,4].publisher let subscriber = publisher.map { $0 * 2 } .filter { $0 > 20 } .sink { (v) in print(v) }
let futurePub = Future<Bool, Never> { promise in return promise(.success(true)) }.sink { (v) in print(v) }
Bunların yanı sıra UIKit ile birlikte switch aksiyonu sonucu işlemine göre label üzerine aksiyon ekleyelim.
import UIKit import Combine class ViewController: UIViewController { @IBOutlet weak var helloLabel: UILabel! @IBOutlet weak var hiSwitch: UISwitch! private var switchSubscriber:AnyCancellable? @Published var switchState:Bool = true override func viewDidLoad() { super.viewDidLoad() setupSwitchPublisher() } func setupSwitchPublisher() { switchSubscriber = $switchState.receive(on: DispatchQueue.main).assign(to: \.isHidden, on: helloLabel) } @IBAction func switchAction(_ sender: UISwitch) { self.switchState = sender.isOn } }
Burada switchState yayıncımızın yayınladığı değer değiştiği zaman .assign ile bunu abone olup, label üzerinde UI değişiklik yapıyoruz.
İlk Yorumu Siz Yapın