İçeriğe geç

Combine ile Operators

Merhabalar bu yazımda Combine ile Operators kullanımını sizlerle paylaşacağım.

Operatörler bildiğimiz gibi yayınlanan veri üzerinde değişiklikler, filtrelemeler, eklemeler yapmamızı sağlıyor. Daha sonrasında en son halini subscribe olarak elde edip kullanabiliyoruz.

Bunlardan bazıları örnekleri ile aşağıda sizlerle paylaşayım.

Map:

Publisher içerisinde ilerleyerek değer üzerinde değişiklik yapar.

let publisher = [1,2,3].publisher
let subject = publisher.map {$0 * 2}
.sink { (val) in
  print(val) // 2,4,6
}

Filter:

Değerler üzerinde filtreleme işlemi yapar.

let publisher = [1,2,3].publisher
let subject = publisher.map {$0 * 5}
.filter {$0.isMultiple(of: 2)}
.sink { (val) in
  print(val) // 10
}

Scan:

Sona doğru toplama işlemi yapar.

let publisher = [1,2,3].publisher
let subject = publisher.scan(0,+)
.sink { (val) in
  print(val) // 1,3,6
}

FlatMap:

Değeri transform etmek ve ulaşmak için kullanılır.

struct User {
    var name:CurrentValueSubject<String, Never>
}

let uSubject = PassthroughSubject<User, Never>()

let subsUser = uSubject.flatMap { $0.name }
.sink { (name) in
    print(name) // Kenan Atmaca
}

let user = User(name: .init("Kenan Atmaca"))
uSubject.send(user)

Merge:

İki adet publisheri birleştirir.

struct User {
    var name:CurrentValueSubject<String, Never>
}

let uSubject = PassthroughSubject<User, Never>()
let uSubject2 = PassthroughSubject<User, Never>()
let mergPub = Publishers.Merge(uSubject, uSubject2)

let mergeSub = mergPub.flatMap {$0.name}
mergPub.sink { (user) in
    print(user.name.value)
}

let user = User(name: .init("Kenan Atmaca"))
let user2 = User(name: .init("@"))

uSubject2.send(user2)
uSubject.send(user)

Catch:

Hata ayıklamanızı sağlar.

enum CombineError:Error {
    case testError
}

extension CombineError: LocalizedError {
    var errorDescription: String? {
        switch self {
        case .testError: return "Eroooor"
        }
        return ""
    }
}

let subject = PassthroughSubject<String,Error>()
let po = subject.eraseToAnyPublisher()

let suub = po.catch { err in
    Just(err.errorDescription!) // Eroooor
}.sink { (val) in
    print(val) // K, A
}

subject.send("K")
subject.send("A")
subject.send(completion: .failure(.testError))

Not: hata ayıklama işlemini direkt olarak .sink üzerinden gerçekleştirebiliriz.

let sub = po.sink(receiveCompletion: { (completion) in
    switch completion {
    case .finished: print("FINISH!")
    case .failure(let error): print(error.errorDescription)
    }
}) { (val) in
    print(val)
}

Bunların dışında daha birçok operatör bulunmakta. Diğer öperatörlerin tamamına link üzerinden ulaşabilirsiniz.

 

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