Swift NSXMLParserDelegate не се извиква

Имам странен проблем. Странността идва от факта, че кодът се изпълнява идеално в playground, но не и в симулатора...
Накратко, имам клас, който трябва да анализира документ, който аз мързеливо инстанцирам и извиквам метода за анализиране от VC. Функцията за анализиране се извиква в класа, но не и функциите на делегата (започнато анализиране, намерени знаци и т.н.). Това е доста влудяващо, тъй като същата настройка работи добре на детската площадка...

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

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
    }
}

И VC извиква класа:

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
Много благодаря, мили сър, вие спасявате животи. Трябва да спомена, че в началото делегатът беше във функцията за извличане, но не работи, така че го преместих в init. Сега го прави. Странно. Бихте ли обяснили малко повече? Много, много благодаря! - person Razvan Soneriu; 31.01.2015
comment
Не знам защо не се получи при първия опит. Може би имаше някаква проста грешка. Както и да е, свойството delegate е свойство на екземпляр, трябва да зададете след като екземплярът бъде създаден. - person rintaro; 31.01.2015
comment
Добре, разбирам, много благодаря. Бях почти сигурен, че има нещо общо с делегацията. наздраве! - person Razvan Soneriu; 31.01.2015