2014-10-28 2 views
4

Моя цель - проанализировать большой XML-файл (20 ГБ) с помощью Swift. В NSXMLParser есть некоторые проблемы с производительностью и переходы на объекты Swift, поэтому я рассматриваю многопоточность. В частности, следующее деление:Межпоточная связь в Swift?

  1. Основной поток - разбирает ДАННЫЕ
  2. рабочий поток - бросает ObjC типы в Swift типов и отправляет 1. Отливка ObjC NSDictionary в [String: String] является самым большим препятствием. Это также является основной причиной разделения на несколько потоков.
  3. Рабочий поток - анализирует XML в типах ObjC - и отправляет на 2. NSXMLParser - это push-парсер, как только он начинает синтаксический анализ, вы не можете его приостановить.

Данные должны анализироваться последовательно, поэтому порядок ввода должен поддерживаться. Моя идея - запустить NSRunLoop как на 1, так и на 2, разрешая параллельную обработку без блокировки. Согласно документации Apple, связь между потоками может быть достигнута путем вызова performSelector:onThread:withObject:waitUntilDone:. Однако этот символ недоступен в Swift.

Я не думаю, что GCD подойдет как решение. Оба рабочих потока должны быть длительными процессами с новой работой, поступающей в произвольные интервалы.

Как можно добиться вышеуказанного (например, NSRunLoops на нескольких потоках) с помощью Swift?

ответ

0

Я использовал NSOperation в первый раз в прошлом месяце, и это очень простой объект для подкласса, вы можете либо связать их вместе с блоками завершения, либо вы можете установить операции как зависимости друг от друга, чтобы они были выполняется последовательно.

Также довольно легко общаться с NSOperations, передавая им объекты.

NSHipster: http://nshipster.com/nsoperation/

Смежные вопросы