У меня есть класс, который реализует протокол XMLParserDelegate
, и во время инициализации он получает строку и обработчик завершения в качестве аргументов.Я пытаюсь вызвать обработчик завершения после разбора строки, но методы XMLParserDelegate
не достигаются из-за освобождения класса.
class MyXMLParser: NSObject, XMLParserDelegate {
private (set) var parser: XMLParser?
private (set) var completion: ((String?) -> Void)?
public init(_ xml: String, _ completion: @escaping ((String?) -> Void)) {
let data = xml.data(using: String.Encoding.utf8)
self.parser = XMLParser(data: data ?? Data())
self.completion = completion
self.parser?.delegate = self
self.parser?.parse()
}
deinit {
// Being called before Parser methods
}
// MARK: - Parser delegate methods
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
// Custom implementation
}
func parserDidEndDocument(_ parser: XMLParser) {
// Custom implementation
self.completion?("Test")
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
self.completion?(nil)
}
}
И я называю это следующим образом:
func someFunc() {
let parser = MyXMLParser(someXMLString) { text in
// Custom implementation
}
}
Я хочу, чтобы замыкание оставалось в живых до тех пор, пока оно не получит значение, вместо того, чтобы деинициализироваться после его локальной области видимости внутрифункции была закончена.Отличный пример того, чего я хочу достичь - это блок завершения UIView.animate()
, который не освобождается, даже если он находится внутри какой-то функции.