İçeriğe geç

Combine ile Publisher ve Subscriber

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.

Tarih:Combine

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Copyright © 2020 Kenan Atmaca