Каков ваш опыт работы с Swift Concurrency?

«Каков ваш опыт работы с Swift Concurrency?» — вопрос из категории Многопоточность, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, есть опыт использования Swift Concurrency (async/await, actors, Task). Применял для сетевых запросов, параллельных вычислений и работы с данными.

Ключевые концепции и примеры:

  1. Async/await для асинхронных операций:

    func fetchUserData() async throws -> User {
        let url = URL(string: "https://api.example.com/user")!
        let (data, _) = try await URLSession.shared.data(from: url)
        return try JSONDecoder().decode(User.self, from: data)
    }
  2. Task для запуска асинхронного кода:

    Task {
        do {
            let user = try await fetchUserData()
            await MainActor.run { self.updateUI(with: user) }
        } catch {
            print("Fetch failed: (error)")
        }
    }
  3. Actors для потокобезопасности:

    actor DataCache {
        private var storage: [String: Data] = [:]
    
        func set(_ data: Data, for key: String) {
            storage[key] = data
        }
    
        func get(for key: String) -> Data? {
            return storage[key]
        }
    }
  4. TaskGroup для параллельных операций:

    func downloadMultipleImages(urls: [URL]) async throws -> [UIImage] {
        try await withThrowingTaskGroup(of: UIImage.self) { group in
            for url in urls {
                group.addTask { try await downloadImage(from: url) }
            }
    
            var images: [UIImage] = []
            for try await image in group {
                images.append(image)
            }
            return images
        }
    }

Практические аспекты:

  • Использовал @MainActor для UI-обновлений
  • Контролировал приоритеты задач (Task(priority: .high))
  • Реализовывал отмену операций через Task.checkCancellation() и Task.isCancelled
  • Избегал блокировок и гонок данных с помощью акторов