iOS inkişafında run loop-u nə vaxt istifadə etmək lazımdır?
sobes.tech Süni İntellekt
AI-dan cavab
İş döngüsü (Run loop), bir axının davranışını idarə etmək, ona hadisələri gözləməyə və uyğun kodu icra etməyə imkan vermək üçün istifadə edilməlidir; bu, onun vəzifəsini yerinə yetirdikdən sonra dərhal sona çatmaması üçün. Bu, aşağıdakı hallarda kritikdir:
-
Əsas axın (Main Thread): Əsas axının run loop-u UIKit/AppKit ilə qarşılıqlı əlaqəni, istifadəçi hadisələrini (toxunma, kliklər), zamanlayıcıları, şəbəkə hadisələrini və
performSelector:withObject:afterDelay:çağrılarını idarə edir. Onun olmaması, tətbiqin istifadəçi fəaliyyətlərinə cavab verə bilməməsinə və UI-nin yenilənməsinə səbəb olar. -
İkincil axınlar: Arxa plan axını asinxron tapşırıqları yerinə yetirməli, daxil olan məlumatları (məsələn, soketlər) dinləməli, digər axınlardan mesajları emal etməli və ya zamanlayıcılar istifadə etməlidir. Tipik ssenarilər:
- Soketlərlə işləmək.
- Zamanlayıcı ilə təkrarlanan tapşırıqları yerinə yetirmək.
- IPC (Inter-Process Communication) mesajlarını qəbul etmək və emal etmək.
- Gələcək sorğuları işləmək üçün axını canlı saxlamaq, onu daim yaratmaq və məhv etmək ehtiyacını aradan qaldırmaq.
İkincil axında run loop istifadə nümunəsi, şəbəkə əlaqəsini saxlamaq ola bilər:
// Swift-də nümunə
class NetworkManager {
private let networkThread = Thread {
// Şəbəkə sessiyasını, soketləri və s. başlatma kodu
// Hadisə mənbəyini (məsələn, soket və ya port) run loop-a əlavə etmək
// CFRunLoopAddSource(CFRunLoopGetCurrent(), source, CFRunLoopMode.defaultMode)
// Lazım gələrsə, zamanlayıcı əlavə etmək
// CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, CFRunLoopMode.defaultMode)
// Run loop-u başlat. Bu, hadisə alınana qədər axını bloklayacaq.
// .distantFuture - beləliklə, run loop dərhal bitməz
RunLoop.current.run()
// Run loop bitdikdən sonra təmizləmə kodu
print("Şəbəkə axını bitdi")
}
func start() {
// `start()` istifadə edin, `detachNewThreadSelector` yerinə
// daha müasir yanaşma
networkThread.start()
}
// Digər axından run loop-u dayandırmaq üçün metod
func stop() {
// Run loop-a bitirmək barədə siqnal göndərmək
// CFRunLoopStop(CFRunLoopGetCurrent()) // və ya xüsusi hadisə əlavə etmək
// Run loop adətən, hadisə mənbələri qalmadıqda və ya açıq şəkildə dayandırıldıqda bitir
}
}
Run loop yalnız bir vəzifəni yerinə yetirib, sonra bitən axınlar üçün lazım deyil (məsələn, DispatchQueue.global().async ilə həyata keçirilən bir dəfəlik arxa plan əməliyyatları). Bu hallarda, Grand Central Dispatch (GCD) kifayət edir.