Permalänk
Hedersmedlem

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 }

Visa signatur

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

Permalänk
Hedersmedlem

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?

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Hedersmedlem
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.

Visa signatur

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

Permalänk
Medlem

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

datatyp variabel = funktionsanrop.

Visa signatur

[IT-Dept]
Ryzen 5700x - 32 - 1070

Permalänk
Hedersmedlem
Skrivet av AllMessedUp:

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.

Visa signatur

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