Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!
Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Ladda hem json data med swift

Hej,

Någon som förstår varför följande kod inte funkar? (iOS/Swift) Den skippar helt enkelt hela koden där jag tar hand om resultatet, så går från raden med dataTask() till task.resume. Förstår inte varför.

Senaste versionen av Xcode används och projektet är skapat med den. Vet inte vilken version av Swift som används.

Edit: Uppdaterade koden

func fetchURL(targetURL: URL) throws -> Data? { var result: Data? = nil let task = URLSession.shared.dataTask(with: targetURL) { data, response, error in if error != nil || data == nil { return } guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else { return } guard let mime = response.mimeType, mime == "application/json" else { return } do { let json = try JSONSerialization.jsonObject(with: data!, options: []) result = data } catch { return } } task.resume() return result }

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Jag tror jag missuppfattar något väldigt grundläggande i Swift.
Tar jag bort koden för att returnera ett resultat så fungerar funktionen som den ska och skriver ut json-datan på konsollen. Så hur kan jag returnera data ur den här typen av kod?

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013

Aldrig suttit med Swift, så tyvärr kan jag inte hjälpa dig med syntaxen om hur du ska skriva.

Men jag tolkar koden som att det är ett API anrop och Task är liknande ett promise? D.v.s. att det kommer att köras i async? Så om du får fram resultatet om du tar bort return har det nog att göra med att return körs innan svaret från ditt anrop kommit tillbaka.
Om du på något sätt (i Swift) ser till att du väntar in svaret från denna metod så bör du kunna få fram din data som du förväntar dig.

Detta kan du nog felsöka bättre än mig med tanke på språket

Se om detta är det du letar efter?
https://stackoverflow.com/questions/45936793/how-to-wait-for-...

Trädvy Permalänk
Moderator
Registrerad
Aug 2007
Skrivet av zaibuf:

Aldrig suttit med Swift, så tyvärr kan jag inte hjälpa dig med syntaxen om hur du ska skriva.

Men jag tolkar koden som att det är ett API anrop och Task är liknande ett promise? D.v.s. att det kommer att köras i async? Så om du får fram resultatet om du tar bort return har det nog att göra med att return körs innan svaret från ditt anrop kommit tillbaka.
Om du på något sätt (i Swift) ser till att du väntar in svaret från denna metod så bör du kunna få fram din data som du förväntar dig.

Detta kan du nog felsöka bättre än mig med tanke på språket

Se om detta är det du letar efter?
https://stackoverflow.com/questions/45936793/how-to-wait-for-...

Du har helt rätt. Anropet är asynkront. Ska prova med semaforen som föreslås i det länkade inlägget. Får bara fundera så jag inte skapar en deadlock.

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Stockhom
Registrerad
Jun 2004

Inte kört med swift än. Men bör ju bara vara att göra något liknande:

datatyp variabel = funktionsanrop.

Main: Ryzen 7 - 1700 @ 3.9 | 32 Gb Corsair 3000 MHz | RX 590 8Gb
Backup: NAS - Synology
--------------------------------------------------
Grundare av MaseApps. Se våra spel: www.maseapps.com. För IOS och Android.

Trädvy Permalänk
Moderator
Registrerad
Aug 2007
Skrivet av Twisteddev:

Inte kört med swift än. Men bör ju bara vara att göra något liknande:

datatyp variabel = funktionsanrop.

Ja, det kan man tycka. Svaret finns i tråden. Koden som tar emot datan körs assynkront, och då har min metod redan returnerat nil och koden som skulle använda svaret har registrerat fel och avbrutit. Jag använde en lösning med semafor som är lik den som är länkad i tråden. Jag borde insett detta, men lurades nog av att koden läggs inline. När jag gjort motsvarande asynkrona anrop med C# så har jag använt delegater.

Prova Swift! Det är roligt att utveckla appar.

Använd gilla för att markera nyttiga inlägg!