Есть несколько способов решить ваши проблемы с помощью BNUtilitiesQuick
.
Основная причина, по которой у вас возникают проблемы, заключается в том, что NSXMLParser использует механизм обратного вызова.Это сделано для того, чтобы вам не приходилось читать весь документ в память сразу - он анализируется по ходу дела.Это означает, что вам нужен уникальный объект делегата для каждого NSXMLParser, который вы создаете.
Решение № 1 - используйте шаблон Singleton
BNUtilitiesQuick
может быть singleton , но тогда вывозникнут проблемы, если вы вызовете его дважды из двух разных потоков (класс будет получать сообщения из обоих документов XML, которые анализируются одновременно).Если многопоточность не является проблемой, это будет работать.
Решение №2. Переключение синтаксических анализаторов XML (избегайте проблемы)
Другое решение заключается в использовании другого синтаксического анализатора XML, который не требует подхода синтаксического анализа на основе делегатов.NSXMLParser основан на SAX, который обычно использует шаблон обратного вызова или делегата.Рэй Вендерлих имеет отличный пост в своем блоге о различных синтаксических анализаторах XML, доступных в iOS, и о том, как выбрать ваш любимый.
Решение № 3 - Создайте объект делегата в методе
Добавьте еще один уровень абстракции - ваш метод синтаксического анализа XML должен создать новый экземпляр нового класса XML Parser Delegate, который будет обрабатывать обратные вызовы для этой конкретной операции синтаксического анализа.Затем, когда вы создаете синтаксический анализатор, присвойте делегату этот вновь созданный объект и проанализируйте XML.
В вашем классе Utils не сохраняется состояние, поэтому вам не нужно беспокоиться о многопоточных проблемах..
Может также помочь вернуть проанализированный объект вместо (void)
в вашем методе синтаксического анализа - это похоже на еще одну ловушку вашего проекта.