Swift - Refresh XML parser data

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
Hoi!

Sinds een aantal weken begonnen met het "leren" van Swift voor IOS.
Heb sinds kort een simple Radio app gemaakt, echter wil ik deze nu voorzien van now playing xml data. Dit is gelukt! Doormiddel van NSXMLParser.

Echter wil ik nu dat de XML data om de xx seconden wordt vernieuwd. Aangezien er ongeveer om de 3 a 4 minuten een nieuw nummer op de radio is. Dit wil nog niet echt lukken.

Code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
override func viewDidLoad() {
        super.viewDidLoad()
        let url:NSURL = NSURL(string: "http://beeradio.nl/playingnow.xml")!
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.parse()
        var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
//removed some code
}

func update() {
        let url:NSURL = NSURL(string: "http://url.nl/blabla.xml")!
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.parse()
        update_nowplaying()
    }
    func update_nowplaying() {
        nowPlayingArtist.text = blogPosts[0].postArtist
        nowPlayingTitle.text = blogPosts[0].postTitle
        print(blogPosts[0].postArtist)
    }


In de debug output zie ik dus wel steeds blogPosts[0].postArtist maar deze vernieuwt zich niet zodra ik de XML tussendoor vernieuw. "Oude" artiest blijft maar staan.

Iemand hier die mij misschien hiermee kan helpen? :) Ben bang dat ik te simpel denk, haha!

Edit: Excuus! Geen [Swift] gedaan in topictitel.

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 01:11

Damic

Tijd voor Jasmijn thee

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
override func viewDidLoad() {
        super.viewDidLoad()
update();
        var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
//removed some code
}

func update() {
        let url:NSURL = NSURL(string: "http://beeradio.nl/playingnow.xml")!
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.parse()
        update_nowplaying()
}
func update_nowplaying() {
        nowPlayingArtist.text = blogPosts[0].postArtist
        nowPlayingTitle.text = blogPosts[0].postTitle
        print(blogPosts[0].postArtist)
}

Heb je vviewdidload aangepast zodoende dat je eeerst de bestaande functie aanroept in de plaats van ze te kopieren en daarna je teller start
Ik weet niet hoe die selector werkt maar moet dat niet zonder "" zijn? Want je roept een functie aan.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
Damic schreef op vrijdag 29 mei 2015 @ 01:17:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
override func viewDidLoad() {
        super.viewDidLoad()
update();
        var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
//removed some code
}

func update() {
        let url:NSURL = NSURL(string: "http://beeradio.nl/playingnow.xml")!
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.parse()
        update_nowplaying()
}
func update_nowplaying() {
        nowPlayingArtist.text = blogPosts[0].postArtist
        nowPlayingTitle.text = blogPosts[0].postTitle
        print(blogPosts[0].postArtist)
}

Heb je vviewdidload aangepast zodoende dat je eeerst de bestaande functie aanroept in de plaats van ze te kopieren en daarna je teller start
Ik weet niet hoe die selector werkt maar moet dat niet zonder "" zijn? Want je roept een functie aan.
Jup! Werkt ook niet. Zie wel dat hij dan om de 10sec 1kb/s data verbruikt. Dus hij haalt de XML wel op, maar vernieuwen doet ie niet.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Damic schreef op vrijdag 29 mei 2015 @ 01:17:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
override func viewDidLoad() {
        super.viewDidLoad()
update();
        var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
//removed some code
}

func update() {
        let url:NSURL = NSURL(string: "http://beeradio.nl/playingnow.xml")!
        parser = NSXMLParser(contentsOfURL: url)!
        parser.delegate = self
        parser.parse()
        update_nowplaying()
}
func update_nowplaying() {
        nowPlayingArtist.text = blogPosts[0].postArtist
        nowPlayingTitle.text = blogPosts[0].postTitle
        print(blogPosts[0].postArtist)
}

Heb je vviewdidload aangepast zodoende dat je eeerst de bestaande functie aanroept in de plaats van ze te kopieren en daarna je teller start
Ik weet niet hoe die selector werkt maar moet dat niet zonder "" zijn? Want je roept een functie aan.
De selectors zijn een overerving van Objective-C, waar het "SEL(methode)" was. In Swift wordt er meer geduwd richting closures enzo. Maar voor backwards compatibility kan je alsnog een string als selector opgeven. Maar je mist dan wel dingen als autocomplete enzo.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 01:11

Damic

Tijd voor Jasmijn thee

Ha ok dus beide zijn goed, in ieder geval gaat er nog iets niet goed met zijn parser of hij krijgt geen data binnen.

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
Damic schreef op vrijdag 29 mei 2015 @ 16:23:
Ha ok dus beide zijn goed, in ieder geval gaat er nog iets niet goed met zijn parser of hij krijgt geen data binnen.
Nja, volgens mij krijg ik wel data binnen. Anders is er geen netwerk activiteit te zien. Niemand hier verder die mij kan helpen? :)

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Gaat het de eerste keer wel goed? Daarnaast, ik zou breakpoints zetten op plekken waar je verwacht dat ie komt. En kijken of de waardes in je variabelen dan goed zijn. Mocht hij ergens niet komen, of een waarde niet goed zijn, dan weet je in ieder geval waar je moet zoeken.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
ZpAz schreef op vrijdag 29 mei 2015 @ 18:42:
Gaat het de eerste keer wel goed? Daarnaast, ik zou breakpoints zetten op plekken waar je verwacht dat ie komt. En kijken of de waardes in je variabelen dan goed zijn. Mocht hij ergens niet komen, of een waarde niet goed zijn, dan weet je in ieder geval waar je moet zoeken.
Laden doet ie gewoon, dan zet ie netjes een Artiest en Titel neer op de juiste plek. Na 10sec update haalt ie wel wat binnen, krijg ook een URL terug als ik een breakpoint zet. Een breakpoint op update_nowplaying pakt ie ook gewoon de artiest en titel. Alleen ik kan niet doormiddel van een breakpoint testen of ie na 10sec wel update?

Maar zoals eerder vermeld, als ik kijk naar netwerkactiviteit, haalt ie wel om de 10sec iets binnen. Alleen weergeven, of tenminste, het updaten van de label doet ie dan niet.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Dennischo schreef op vrijdag 29 mei 2015 @ 18:47:
[...]
Alleen ik kan niet doormiddel van een breakpoint testen of ie na 10sec wel update?
Sorry, dit volg ik niet, je kan een breakpoint op al je code zetten lijkt me toch. De code die aangeroepen wordt na 10 seconden, welke je scherm updated. Daar kan je toch gewoon een breakpoint neerzetten?

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
ZpAz schreef op vrijdag 29 mei 2015 @ 19:08:
[...]


Sorry, dit volg ik niet, je kan een breakpoint op al je code zetten lijkt me toch. De code die aangeroepen wordt na 10 seconden, welke je scherm updated. Daar kan je toch gewoon een breakpoint neerzetten?
Ah, ja! Sorry.

In die 10sec snel de XML gewijzigd, hij haalt wel de nieuwe XML op maar voegt het toe aan de bestaande XML. Dus ipv blogPosts[0].postArtist wordt het dan ineens blogPosts[11].postArtist

code:
1
2
3
4
5
6
7
8
9
10
"Oude XML"
[0] BlogPost    0x00007fca795838a0  0x00007fca795838a0
postArtist  String  "Billy The Kit&Duvall"  
postTitle   String  "Burn It Down"  

VS
Nieuw geladen XML via update:
[11]    BlogPost    0x00007fca79582000  0x00007fca79582000
postArtist  String  "Bbilly The Kit&Duvall" 
postTitle   String  "Burn It Down"


Als ie update krijgt ie dus ook een andere 0x000... mee. Kortom, hij haalt het wel op, maar na elke update wordt het [..] getal groter blijkbaar.

Fout gevonden dus, hoe los ik dit nu op? :P

[ Voor 3% gewijzigd door Dennischo op 29-05-2015 19:32 ]


Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Als het niet de bedoeling is dat hij het toevoegt aan de bestaande geparste XML, en hij schoont de oude niet zelf op, dan moet je met eigen code de oude opschonen.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 01:11

Damic

Tijd voor Jasmijn thee

Huhu tip zit wrs in je parser

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Dennischo
  • Registratie: September 2007
  • Niet online
Voor nu opgelost met blogPosts.removeAll() waarna de update begint. Doet nu wel wat ie moet doen.

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 01:11

Damic

Tijd voor Jasmijn thee

Dat is ook een manier :p

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag

Pagina: 1