Swift ile çoklu işlem ortamlarında thread safety sağlamak, geliştiricilerin sıklıkla karşılaştığı bir zorluktur. Ancak, Swift 5.5 sürümüyle birlikte gelen Actor mekanizması, bu sorunları ele almak için güçlü bir araç sunuyor. Bu blog yazısında, Actor’lerin kullanımını göstermek amacıyla daha önce bu durumu nasıl çözdüğümüzle alakalı yazdığım yazıdaki aynı örneği kullanacağız.
Thread Safety ve Diziler: Swift ile Güvenli Çoklu İşlemler adlı yazı için (Swift 5.5 öncesinde bu durumu nasıl çözüyoruz.)
Actor Nedir?
Actor, Swift dilinde paylaşılan veriye güvenli erişim sağlamak ve data race durumlarını engellemek için tasarlanmış bir mekanizmadır. Swift’in Concurrency Standart kütüphanesinin bir üyesidir. Sınıflarla bazı küçük farklılıklar dışında aynı yapıdadırlar. Sınıflar, eşzamanlılık sorunlarını çözmek için ek manuel senkronizasyon gerektirebilirken, Actor’lar otomatik erişim serileştirmesi sayesinde veri yarışlarına (data race) karşı doğal bir koruma sağlar ve miras alma/katılımı (inheritance) desteklemezler.
Bir actor, içerisindeki kodu yalnızca tek bir thread üzerinde çalıştırarak, paylaşılan veriye güvenli bir şekilde erişimi sağlar.
Data Race Nedir?
// Actor sınıfı tanımlama (Önceki Örneğimiz)
actor DataService {
private var data = [String]()
// Veri ekleme
func addData(_ item: String) {
data.append(item)
}
// Veri silme
func removeData(at index: Int) {
if index < data.count {
data.remove(at: index)
}
}
// Veri güncelleme
func updateData(at index: Int, with newItem: String) {
if index < data.count {
data[index] = newItem
}
}
// Veri listeleme
func listData() {
print("Data List:")
for item in data {
print("- \(item)")
}
}
}
Yukarıdaki kod bloğu, DataService
adında bir actor veri yapısı tanımlar. Bu veri yapısı, veri ekleme, silme, güncelleme ve listeleme işlemlerini güvenli ve seri bir şekilde gerçekleştirmek için Actor olarak işaretlenmiştir.
Actor Kullanımı:
// Örnek kullanım
let dataService = DataService()
// Actor fonksiyonlarına erişim
Task {
await dataService.addData("Item 1")
await dataService.addData("Item 2")
await dataService.listData()
await dataService.updateData(at: 0, with: "Updated Item 1")
await dataService.listData()
await dataService.removeData(at: 1)
await dataService.listData()
}
Swift 5.5 ile gelen Actor mekanizması, çoklu işlem ortamlarında thread safety sağlamak için etkili bir araç sunmaktadır. Actor’ler, paylaşılan veriye güvenli erişimi sağlama konusunda geliştiricilere yardımcı olurken, kodun daha okunabilir ve yönetilebilir olmasını sağlar.