Combine: bu nima, asosiy tushunchalar va Publisher bilan Subscriber

Muallif: IT Sectr Nashr etilgan: 2026-03-17 O'qish vaqti: 8 daq

Combine — bu iOS 13 da taqdim etilgan Apple tomonidan reaktiv dasturlash freymvorki. Apple Documentation, 2025 ma'lumotlariga ko'ra, Combine asinxron hodisalarni qayta ishlash uchun yagona deklarativ API-ni ta'minlaydi. Publisher ma'lumotlar manbasini belgilaydi, Subscriber esa ularni olish uchun obuna bo'ladi.

Asosiy

  • Combine — iOS 13 dan mavjud bo'lgan Apple-ning o'rnatilgan reaktiv dasturlash freymvorki
  • Publisher — Failure xato imkoniyati bilan Output qiymatlari manbasini belgilaydigan protokol
  • Subscriber — boshqariladigan demand bilan Publisher-dan qiymatlarni qabul qiladigan protokol
  • Subject — hodisalarni qo'lda kiritishga ruxsat beruvchi Publisher (PassthroughSubject, CurrentValueSubject)
  • Operators — oqimlarni transformatsiya qilish va birlashtirish uchun map, filter, combineLatest, flatMap

Combine nima?

Combine — vaqt davomida asinxron hodisalarni qayta ishlash uchun deklarativ Swift freymvorki. Callback yondashuvlaridan farqli o'laroq, Combine operatorlar zanjiri orqali ma'lumotlarni qayta ishlash quvurlarini tavsiflash imkonini beradi. Freymvork Foundation (URLSession, Timer, NotificationCenter) va SwiftUI (ObservableObject, @Published) bilan integratsiyalangan.

Publisher protokoli

Publisher protokolini amalga oshiradigan har qanday tur Output (qiymatlar turi) va Failure (xato turi) ni belgilashi kerak. Publisher obuna bo'lgunga qadar faol emas — u subscribe chaqirilgandan keyingina hodisalarni chiqara boshlaydi. Bu reaktiv oqimlarga xos bo'lgan sovuq semantika bo'lib, samaradorlikni oshiradi.

Subscriber protokoli

Subscriber hodisalarni uchta metod orqali qabul qiladi: receive(subscription:) — demand boshqaruvi bilan obunani tasdiqlash; receive(_:) — yangi qiymatni olish; receive(completion:) — oqimning muvaffaqiyat yoki xato bilan tugashi. Demand Subscriber qabul qilishga tayyor bo'lgan qiymatlar sonini belgilaydi — bu backpressure mexanizmi.

O'rnatilgan Publisher-lar

Apple ko'plab o'rnatilgan Publisher-larni taqdim etadi: Just bitta qiymatni chiqaradi va tugaydi, Future — yopilish bilan asinxron natija, Deferred — obuna momentiga qadar kechiktirilgan Publisher yaratish. URLSession.dataTaskPublisher tarmoq so'rovini reaktiv oqimga aylantiradi. Timer.publish davriy taymer yaratadi. NotificationCenter.default.publisher bildirishnomalarni Publisher-ga aylantiradi. Bu integratsiyalar qo'lda ko'prik qurmasdan hodisalarga obuna bo'lish imkonini beradi.

Combine-da Publisher va Subscriber

Combine-da Publisher va Subscriber Subscription protokoli orqali bog'langan. Subscription ma'lumot oqimini boshqaradigan bog'lovchi ob'ektdir. Dasturchi o'zining Publisher turlarini yaratishi shart emas — Apple o'rnatilgan Just, Future, Deferred, Fail, Empty, shuningdek URLSession va Timer uchun Publisher-larni taqdim etadi.

Combine-da Subject

Subject — ichiga qo'lda qiymatlar yuborish mumkin bo'lgan Publisher. PassthroughSubject holatni saqlamaydi: obunachi faqat obunadan keyin sodir bo'lgan hodisalarni oladi. RxSwift-dagi BehaviorRelay-ga o'xshash CurrentValueSubject joriy qiymatni saqlaydi va darhol yangi obunachiga uzatadi.

Backpressure

Combine-da backpressure mexanizmi ma'lumot uzatish tezligini tartibga soladi. Subscriber subscription.request(.unlimited) yoki subscription.request(.max(N)) orqali Publisher-ga nechta qiymatni qayta ishlashga tayyorligini bildiradi. Bu ishlab chiqaruvchi va iste'molchining notekis tezligida buferning to'lib ketishining oldini oladi.

Combine operatorlari

Combine toifalarga bo'lingan 100 dan ortiq operatorni o'z ichiga oladi: transformatsiya (map, tryMap, flatMap), filtrlash (filter, compactMap, removeDuplicates), birlashtirish (combineLatest, merge, zip), vaqtni boshqarish (debounce, throttle, delay) va xatolarni qayta ishlash (catch, replaceError, retry).

combineLatest operatori ikki Publisher-ning oxirgi qiymatlarini birlashtiradi — har safar ulardan biri yangi qiymat chiqarganda, yopilish ikkala yangilangan qiymat bilan chaqiriladi. Bu operator bir vaqtning o'zida bir nechta kiritish maydonlarining holatini kuzatish kerak bo'lgan formalarni tekshirishda ajralmas hisoblanadi.

debounce operatori yangi hodisalarsiz belgilangan interval o'tguncha qiymatlarni nashr etishni kechiktiradi. Bu qidiruv satrlari uchun juda muhim: foydalanuvchi 300-500 ms yozishni to'xtatgandan keyin serverga so'rov yuboriladi, bu yukni 5-10 marta kamaytiradi.

Xatolarni qayta ishlash

Combine operatorlar darajasida bir nechta xatolarni qayta ishlash strategiyalarini taklif qiladi. catch Failure-ni tutadi va Publisher-ni zaxira bilan almashtiradi — oqim buzilmasdan davom etadi. replaceError(with:) xato o'rniga standart qiymat qo'yadi. retry(_:) muvaffaqiyatsizlikda obunani belgilangan marta takrorlaydi. Muhim: Publisher imzosidagi Never xato turi oqim hech qachon xato bilan tugamasligini kafolatlaydi — bu Publisher-dan SwiftUI-da Failure-ni boshqarmasdan foydalanish imkonini beradi.

Combine kod namunalari

Birinchi misol Just — bitta qiymat chiqarib tugaydigan Publisher bilan asosiy ishni ko'rsatadi:

swift
let publisher = Just("Hello Combine")

publisher
    .sink(receiveCompletion: { completion in
        print("Tugallandi: \(completion)")
    }, receiveValue: { value in
        print("Qabul qilindi: \(value)")
    })

Ikkinchi misol Combine-ni URLSession bilan tarmoq so'rovi va natijani asosiy ipda qayta ishlash uchun integratsiyasini namoyish etadi:

swift
let url = URL(string: "https://api.example.com")!

URLSession.shared
    .dataTaskPublisher(for: url)
    .map { $0.data }
    .receive(on: DispatchQueue.main)
    .sink(receiveCompletion: { completion in
        if case .failure(let error) = completion {
            print("Xato: \(error)")
        }
    }, receiveValue: { data in
        print("Ma'lumot qabul qilindi: \(data.count)")
    })

Uchinchi misol — holatni boshqarish uchun CurrentValueSubject dan foydalanish:

swift
let counter = CurrentValueSubject<Int, Never>(0)

counter
    .sink { value in
        print("Hisoblagich: \(value)")
    }

counter.send(1) // Ko'rsatadi: Hisoblagich: 1
counter.send(2) // Ko'rsatadi: Hisoblagich: 2
print(counter.value) // Ko'rsatadi: 2

Combine vs RxSwift

Combine va RxSwift bir xil vazifani — reaktiv dasturlashni hal qiladi, ammo turli yondashuvlar bilan. Combine tizimga o'rnatilgan mahalliy Apple freymvorki: bog'liqliklarni o'rnatishni talab qilmaydi, SwiftUI va Foundation bilan integratsiyalangan. RxSwift iOS 9+ qo'llab-quvvatlashi va kengroq operatorlar to'plami bilan uchinchi tomon kutubxonasidir.

Combine-ning ishlashi C tilidagi mahalliy amalga oshirish tufayli odatiy stsenariylarda yuqoriroq. RxSwift ko'proq disk raskadrovka vositalarini taqdim etadi (RxSwift.Resources.total, Debug), lekin uning ob'ektga yo'naltirilgan arxitekturasi katta ma'lumot oqimlarida kamroq samarali bo'lishi mumkin. Ularning o'rtasida tanlov imkoniyatlar va integratsiya o'rtasidagi kelishuvdir.

Muhim farq — backpressure modeli. Combine-da Subscriber Subscription orqali demand-ni boshqaradi, bu oqim tezligi ustidan aniq nazorat beradi. RxSwift-da backpressure sukut bo'yicha boshqarilmaydi — Observable barcha qiymatlarni chiqaradi, Subscriber esa ularni kelishi bilan qayta ishlaydi. Katta ma'lumot oqimlari uchun Combine bashorat qilish mumkin bo'lgan va xotira jihatidan xavfsizroq.

Combine til darajasida SwiftUI bilan chuqur integratsiyalangan. @Published Publisher yaratadi, ObservableObject objectWillChange Publisher-ni taqdim etadi. SwiftUI View avtomatik ravishda ushbu Publisher-larga obuna bo'ladi va o'zgarishlarda qayta chiziladi. UIKit uchun CombineCocoa kabi uchinchi tomon qoplamalari mavjud, ammo Combine aslida SwiftUI uchun mo'ljallangan, shuning uchun uning UIKit bilan integratsiyasi qo'shimcha kod talab qiladi. RxSwift esa UIKit uchun boy ekotizimga ega: RxCocoa barcha UI elementlari uchun reaktiv qoplamalarni taqdim etadi.

Combine Core Data bilan NSFetchedResultsController Publisher orqali integratsiyani qo'llab-quvvatlaydi. Publisher Core Data stekidagi har bir o'zgarishda — yozuvlarni qo'shish, o'chirish, yangilash — yangi ma'lumotlarni chiqaradi. Bu qo'lda reloadData chaqirmasdan reaktiv ro'yxatlar qurish imkonini beradi. Combine-ni UIApplication.willResignActiveNotification uchun NotificationCenter Publisher bilan birlashtirib, dasturchi delegatlar va callback-larsiz butun dastur hayotiy sikli uchun reaktiv qatlam yaratadi. ObservableObject sinflari uchun SwiftUI @Published xususiyatlari o'zgarganda View-ni avtomatik yangilaydi — Combine bir satr qo'lda kod bo'lmasdan butun bog'lanishni ta'minlaydi. Combine kodining modul testi XCTestExpectation va Publisher.sink orqali ImmediateScheduler bilan Scheduler izolyatsiyasi bilan test holatlarida amalga oshiriladi.

UIKit loyihalarida Combine bilan ishlaganda, dasturchilar ko'pincha sink orqali obunadan foydalanadilar va AnyCancellable-ni Set-da saqlaydilar. Odatdagi naqsh: ViewController ko'rinish yaratadi, cancellables saqlaydi, ViewModel-dan Publisher-ga obuna bo'ladi. Deinit paytida barcha obunalar Cancellables kolleksiyasi orqali avtomatik bekor qilinadi. Combine-da UIControl bilan to'g'ri ishlash uchun publisher(for:) kengaytmasi orqali UIControl.Event Publisher-dan foydalanish mumkin.

Combine-ni disk raskadrovka qilish print() yoki handleEvents() operatori orqali amalga oshiriladi. print(String) barcha hodisalarni qayd etadi: receive subscription, request demand, receive value, receive completion. handleEvents nozikroq nazorat beradi: Publisher hayotiy siklining har bir bosqichi uchun yopilishlar belgilanishi mumkin. Combine testi uchun CombineExpectations mavjud — virtual vaqt va demand nazorati bilan testlarda Publisher kutilgan qiymatlarni chiqarishini tekshirish imkonini beruvchi kutubxona.

Combine amaliyotda

Combine SwiftUI-da formalarni boshqarish uchun faol ishlatiladi: har bir @Published xususiyati Publisher yaratadi, SwiftUI View.body orqali unga obuna bo'ladi. Bir nechta Publisher-ni combineLatest orqali birlashtirib, formani tekshirish deklarativ bo'ladi: har bir Publisher bir maydonni kuzatadi, combineLatest barcha qiymatlarni to'playdi, map ularni tekshiradi va Submit tugmasi holatini qaytaradi. Publishers.Merge bir turdagi bir nechta Publisher-ni bittaga birlashtiradi „ turli boshqaruv elementlaridan hodisalarni yagona oqimda to'plash uchun foydali.

Combine-ni UIKit bilan integratsiya qilish uchun kengaytma orqali UIControl Publisher dan foydalaning: button.publisher(for: .touchUpInside) bosilganda hodisa chiqaradigan Publisher-ni qaytaradi. CombineCocoa — barcha UIControl hodisalari, UITextView.text, UIScrollView.contentOffset uchun Publisher taqdim etuvchi jamoa kutubxonasi. Obunani bekor qilishda cancellables Store deinit-da tozalanadi, hech qanday obuna egasidan uzoq yashamasligini kafolatlaydi. Ko'p holatli UIControl uchun Publishers.MergeMany dan foydalanib Publisher-larni massivda birlashtiring.

Tez-tez beriladigan savollar

Combine iOS-ning qaysi versiyasidan mavjud?

Combine iOS 13, macOS 10.15, tvOS 13 va watchOS 6 dan mavjud. Bu eski versiyalarni qo'llab-quvvatlashni talab qiladigan loyihalarda foydalanishni cheklaydi. iOS 12 va past uchun RxSwift yoki uchinchi tomon kutubxonalari qo'llaniladi.

PassthroughSubject CurrentValueSubject-dan qanday farq qiladi?

PassthroughSubject holatni saqlamaydi va oxirgi qiymatni yangi obunachilarga takrorlamaydi — ular faqat kelajakdagi hodisalarni oladi. CurrentValueSubject joriy qiymatni saqlaydi va darhol yangi obunachiga uzatadi. CurrentValueSubject.value joriy qiymatni sinxron o'qish va yozish imkonini beradi.

Combine SwiftUI bilan qanday integratsiyalanadi?

Combine SwiftUI asosida yotadi: @Published Publisher yaratadi, ObservableObject objectWillChange Publisher-dan foydalanadi. SwiftUI View avtomatik ravishda @ObservedObject va @StateObject-ga Combine quvuri orqali obuna bo'ladi va xususiyatlar o'zgarganda View-ni qayta chizadi.

Combine-da backpressure nima?

Backpressure — ma'lumot uzatish tezligini boshqarish mexanizmi. Subscriber Subscription-ga nechta qiymatni qayta ishlashga tayyorligini bildiradi (demand). Publisher so'ralganidan ko'p chiqara olmaydi. Bu tarmoq soketlaridan katta ma'lumot oqimlari bilan ishlashda juda muhim.

Combine-da xatolarni qanday boshqarish kerak?

catch operatori xatoni tutib, Publisher-ni fallback bilan almashtiradi. replaceError xatoni standart qiymat bilan almashtiradi. retry xatoda obunani belgilangan marta takrorlaydi. Barcha operatorlar subscribe-dan oldin joylashtirilishi kerak, Failure da buzilishni oldini olish uchun.

Xulosa

  • Combine — iOS 13 dan o'rnatilgan Apple reaktiv dasturlash freymvorki
  • Publisher — Output va Failure bilan protokol, obunadan keyin ish boshlaydi
  • Subscriber — demand qo'llab-quvvatlashi bilan receive orqali qiymatlarni qabul qiladi
  • Subject (PassthroughSubject, CurrentValueSubject) — qo'lda hodisa kiritish bilan Publisher
  • Operatorlar map, filter, combineLatest, debounce, catch — quvur asosi
  • Backpressure demand orqali Subscriber buferining to'lib ketishining oldini oladi
  • Yangi loyihalar uchun iOS 13 dan Combine-ni, eski versiyalarni qo'llab-quvvatlash uchun RxSwift-ni tanlang

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing