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 — 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 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 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.
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 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.
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.
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 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.
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.
Birinchi misol Just — bitta qiymat chiqarib tugaydigan Publisher bilan asosiy ishni ko'rsatadi:
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:
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:
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 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 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 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 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 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.
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.
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
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.