Swift - problem z obróbką danych

Odpowiedz Nowy wątek
2018-12-06 10:01
0

Witam jestem początkującym programistą i dopiero nie dawno rozpocząłem przygodę z Swiftem (Wcześniej JAVA ) i napotkałem problem. Moim celem jest wyciągnięciem danych z swojego API i zapisanie do Stringa . Połączyłem sie z API pobieram dane ale nie mogę zapisać do listy meczę się z tym już ponad 2 dni i nie wiem w czym tkwi problem a i pomysły mi się kończą .


class SprzedarzViewController: UIViewController {
    var ListaTowar : [String]  = [] // lista do której chce zapisać
    override func viewDidLoad() {
        super.viewDidLoad()
        Connect()
        ListaTowar.append("Test")
        Drukowani()
    }
    struct towar:Decodable {  // obiekt do pobrania danych
        let symbol : String?
        let ilosc : Double?
    }

    func Connect() {
        let url =  "http://ip/api/Sprzedar?pytanie="
        let UrlObj = URL(string: url)
        URLSession.shared.dataTask(with: UrlObj!){(data,response,error)in
            do{
                var Towary = try JSONDecoder().decode([towar].self , from: data!)
                for towar in Towary{
                    if towar.symbol != nil{
                        print(towar.symbol!) // sprawdzam czy są pobierana dane - są .
                        self.ListaTowar.append(towar.symbol!) // tutaj zapisuję do list ale to nie działa :( 
                    }
                }
            }catch{
                print("we have the  error")

            }
            }.resume()

    }

    @IBAction func szukaj(_ sender: Any) { // przycisk 
        Drukowani()
    }

    func TestList (symbolSend : [String]){ // Poprzednia próba nie udana 
        print(symbolSend.count)
        for symbolSend in symbolSend
        {
            print(symbolSend)
        }

    }
    func Drukowani () { // funkcjia do testowania czy sie zapisało za każdy razem zwraca nic lub testowy rekord :/ 
        print("Test Start")
        print(ListaTowar.count)
        for ListaTowar in ListaTowar  {
            print(ListaTowar)
        }
        print("Test Koniec")
    }

}

Próbowałem już różnych sposobów ale nie pomogły tym bardziej nie wiem w czym tkwi problem bo nie wyskakuje mi żaden błąd i nie wiem czemu do listy nie chce się zapisać zmienne , moze ktoś ma pomysł ?

Pozostało 580 znaków

2018-12-06 11:43
0

Cześć,

z samego kodu wygląda ok. Z tym wypisywaniem chyba jest coś nie tak:

func Drukowani () { // funkcjia do testowania czy sie zapisało za każdy razem zwraca nic lub testowy rekord :/ 
        print("Test Start")
        print(ListaTowar.count)
        for ListaTowar in ListaTowar  {
            print(ListaTowar)
        }
        print("Test Koniec")
    }

chyba lepiej byłoby napisać:

 for towar in ListaTowar  {
            print(towar)
        }

Podobnie w metodzie TestList pętla wygląda trochę dziwnie.

Daj znać czy pomogło.

Dodatkowo, raczej nie zaleca się używać w kodzie języka polskiego.

Pozostało 580 znaków

2018-12-06 15:39
0

Domyślam się w czym problem.

W viewDidLoad robisz następujące rzeczy:

  1. Connect() - rozpoczynasz zadanie (dataTask) pobierania danych
  2. ListaTowar.append("Test") - dodajesz dane testowe
  3. Drukowani() - drukujesz zawartość ListaTowar

No i teraz powiedz mi gdzie w tej sekwencji dostajesz dane z serwera? Kiedy dataTask się zakończy?
Odpowiedź! Nie szybciej jak zakończy się wykonywanie viewDidLoad, więc nie masz tych danych w momencie wypisywania danych.
Jak dostajesz odpowiedź (i wykonane jest closure), to czy wypisujesz nowe wartości tablicy. NIE! Nie ma więc powodu byś je zobaczył!


Moja rada naucz się używać debuggera. Bardzo pomocne i proste w użyciu.

Jak widzisz kod, to po lewej stronie masz numery linii. Kliknij tam w paru miejscach, pojawi się niebieski znaczek.
Potem uruchom program i zobacz co się stanie!


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 4x, ostatnio: MarekR22, 2018-12-06 15:51

Pozostało 580 znaków

2018-12-09 16:37
0

@MarekR22 ma rację. Jak już masz działanie asynchroniczne, to wszystkie działania kaskadowe (następujące po nim, lub powiązane z nim), należy wykonywać w tej samej kolejce (upraszczając). Sprawdzenie efektu działania asynchronicznego w kolejce synchronicznej (którą jest główna kolejka wywołująca m.in. funkcje cyklu życia kontrolerów) czasami przyniesie skutek, a czami nie - w tym wypadku pawie nigdy się nie uda.

I btw. przyłóż się do pilnowania konwencji. Wiem, że to upierdliwe, ale jeśli teraz się nauczysz pisać niezgodnie z nią, to potem będzie Ci trudniej. Mowa o nazywanie propertisów identyfikatorami zaczynającymi się z małej listery, tak samo nazwy funkcji. I nigdy (NIGDY) nie mieszaj do kodu języka innego niż angielski.

Pozostało 580 znaków

wczoraj, 09:21
0

Witam rozwiązałem problem ;) ale co do @MarekR22 twojej odp w funkcji Connect() jest fragment kodu w którym próbuje zapisać dane z serwera

self.ListaTowar.append(towar.symbol!)

ale jak już zauważyliście robiłem to źle

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0