Моя цель - проанализировать большой XML-файл (20 ГБ) с помощью Swift. В NSXMLParser есть некоторые проблемы с производительностью и переходы на объекты Swift, поэтому я рассматриваю многопоточность. В частности, следующее деление:Межпоточная связь в Swift?
- Основной поток - разбирает ДАННЫЕ
- рабочий поток - бросает ObjC типы в Swift типов и отправляет 1. Отливка ObjC NSDictionary в [String: String] является самым большим препятствием. Это также является основной причиной разделения на несколько потоков.
- Рабочий поток - анализирует XML в типах ObjC - и отправляет на 2. NSXMLParser - это push-парсер, как только он начинает синтаксический анализ, вы не можете его приостановить.
Данные должны анализироваться последовательно, поэтому порядок ввода должен поддерживаться. Моя идея - запустить NSRunLoop как на 1, так и на 2, разрешая параллельную обработку без блокировки. Согласно документации Apple, связь между потоками может быть достигнута путем вызова performSelector:onThread:withObject:waitUntilDone:
. Однако этот символ недоступен в Swift.
Я не думаю, что GCD подойдет как решение. Оба рабочих потока должны быть длительными процессами с новой работой, поступающей в произвольные интервалы.
Как можно добиться вышеуказанного (например, NSRunLoops на нескольких потоках) с помощью Swift?