Тех собес на middle-senior IOS Разработчик в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории IOS Разработчик

Посмотреть видео в категории

(2025-10-18)

Техническое собеседование

Задача 1: Асинхронная обработка чисел с использованием GCD

Реализуйте функцию processNumbers, которая принимает массив чисел и выполняет асинхронную обработку каждого числа. Обработка выполняется в фоновом потоке с использованием DispatchQueue.

Функция должна:

  1. Обрабатывать числа параллельно.
  2. После завершения обработки всех чисел вызвать замыкание завершения completion, передав массив результатов обработки.
  3. Обработка каждого числа представляет собой его умножение на 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"
        }
    }
}

Вложения

37_2498_photo.jpg