Техническое собеседование
Задача 1: Асинхронная обработка чисел с использованием GCD
Реализуйте функцию processNumbers, которая принимает массив чисел и выполняет асинхронную обработку каждого числа. Обработка выполняется в фоновом потоке с использованием DispatchQueue.
Функция должна:
- Обрабатывать числа параллельно.
- После завершения обработки всех чисел вызвать замыкание завершения
completion, передав массив результатов обработки. - Обработка каждого числа представляет собой его умножение на 2 с задержкой в 1 секунду (имитация долгой операции).
Пример интерфейса:
func processNumbers(_ numbers: [Int], completion: @escaping ([Int]) -> Void) {
let queue = DispatchQueue(concurrent)
let dispatchGroup = DispatchGroup()
let result = [Int](numbers.size)
let lock = Lock()
for n in numbers.in {
dispatchGroup.enter()
queue.async {
let newN = n * 2
sleep(1)
lock.lock()
results.[n] = result
lock.unlock()
dispatchGroup.leave()
}
}
dispatchGroup.notify() {
completion(result)
}
}
Пример использования:
let numbers = [1, 2, 3, 4, 5]
processNumbers(numbers) { results in
print("Обработанные числа: (results)")
}
Ожидаемый результат:
Через ~1 секунду вывод в консоль:
Обработанные числа: [2, 4, 6, 8, 10]
Задача 2: Анализ Swift кода с UI и многопоточностью
Проанализируйте следующий Swift код. Что произойдет при его выполнении? Какие проблемы могут возникнуть и как их исправить?
class MyCustomController: UIViewController {
weak var alert: UILabel?
override func viewDidLoad() {
let frame = CGRect(x: 100, y: 100, width: 100, height: 50)
alert = UILabel(frame: frame)
alert?.text = "Please wait..."
view.addSubview(alert!)
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 10)
self.alert?.text = "Waiting over"
}
}
}
Вложения
