Swift NSXMLParserDelegate не вызывается

У меня странная проблема. Странность возникает из-за того, что код идеально выполняется на игровой площадке, но не в симуляторе...
Короче говоря, у меня есть класс, который должен анализировать документ, который я лениво создаю и вызываю метод разбора. из ВК. Функция синтаксического анализа вызывается в классе, но не функции делегата (начался синтаксический анализ, найдены символы и т. д.). Это немного сводит с ума, так как такая же установка прекрасно работает на детской площадке...

Класс разбора (и протокол):

protocol DefintionFetching {
    func fetchingDidFinish(results: [String: NSMutableAttributedString])
}

class DefinitionFetcher: NSObject, NSXMLParserDelegate {
    var delegate: DefintionFetching

    var parser = NSXMLParser()
    let url = NSURL(string: "http://dexonline.ro/definitie/soapta/xml")!

    var element = String()
    var finalDefinitions = [String: NSMutableAttributedString]()

    init(delegate: DefintionFetching) {
        self.delegate = delegate
        super.init()
        parser.delegate = self
    }

    func fetch() {
        println("fetch called") // this gets called
        parser = NSXMLParser(contentsOfURL: url)!
        parser.parse()
    }

    func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject: AnyObject]!) {
        // this doesn't get called
    }
}

И ВК, вызывающий класс:

class DexVC: UIViewController, DefintionFetching {
    lazy var definitionFetcher: DefinitionFetcher = DefinitionFetcher(delegate: self)

    func fetchingDidFinish(results: [String: NSMutableAttributedString]) { }

    @IBAction func doShit(sender: AnyObject) {
        definitionFetcher.fetch()
    }
}

Любая помощь будет безумно высоко оценена!


person Razvan Soneriu    schedule 31.01.2015    source источник
comment
Проверьте возвращаемое значение parser.parse(). Если неверно, выведите parser.parserError().   -  person Martin R    schedule 31.01.2015


Ответы (1)


Вы заменили свойство parser из исходного экземпляра.

func fetch(){
    println("fetch called")
    parser = NSXMLParser(contentsOfURL: url)!
//  ^^^^^^^^^ HERE
    parser.parse()
}

так что parser.delegate = self в init совершенно бессмысленно.

пытаться:

func fetch(){
    println("fetch called")
    parser = NSXMLParser(contentsOfURL: url)!
    parser.delegate = self // <-- ADDED
    parser.parse()
}
person rintaro    schedule 31.01.2015
comment
Большое спасибо, добрый сэр, вы спасаете жизнь. Я должен упомянуть, что сначала делегат был в функции выборки, но он не работал, поэтому я переместил его в инициализацию. Теперь это так. Странный. Не могли бы вы объяснить немного больше? Большое большое спасибо! - person Razvan Soneriu; 31.01.2015
comment
Я не знаю, почему это не сработало с первой попытки. Может быть, там была какая-то простая ошибка. В любом случае, свойство delegate является свойством экземпляра, его необходимо установить после создания экземпляра. - person rintaro; 31.01.2015
comment
Хорошо, я понял, большое спасибо. Я был почти уверен, что это как-то связано с делегацией. Ваше здоровье! - person Razvan Soneriu; 31.01.2015