Swift, выдача присвоения массива переменной - PullRequest
0 голосов
/ 21 марта 2020

, поэтому у меня есть этот файл, который получает массив JSON из конечной точки API, а затем должен присвоить его наблюдаемой переменной объекта, чтобы его можно было извлечь и повторить в foreach l oop. Я все еще новичок в Swift, но это выглядит так:

import SwiftUI
import Combine
import Foundation

public struct ActivityModel: Codable {
    public let id: Int
    public let name: String
    public let activity_desc: String?
}


public struct ActivitiesModel2: Codable {
    public let location: String
    public let popular: [String:ActivityModel]
}

public struct ActivitiesModel: Codable {
    public let activities: ActivitiesModel2
}

public class ActivityFetcher: ObservableObject {
    var activities: [ActivitiesModel]()

    init(){
        guard let url = URL(string: "http://mywebsite.com/api/loadapi") else { return }

        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = "POST"

        URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in

            do {
                if let d = data {
                    let decodedLists = try JSONDecoder().decode(ActivitiesModel.self, from: d)
                    DispatchQueue.main.async {
                        self.activities = [decodedLists]
                    }
                    print(self.activities)
                    print(decodedLists)
                } else {
                    print("No Data")
                }
            } catch {
                print("Error")
            }

        }.resume()
    }
}

Код работает до того момента, когда я пытаюсь приравнять self.activities к decodedLists, потому что при печати decodedLists возвращает правильный массив из JSON API, печать self.activities после того, как я определил его как равный decodedLists, возвращает только: «[]». Почему он возвращает пустой массив, когда он четко определен при печати decodedLists, мне неизвестно. Я попытался снять скобки, подумав, что, может быть, это преобразование словаря в массив и потерпел неудачу, но я не могу удалить ни одну из скобок без возврата ошибки.

1 Ответ

0 голосов
/ 21 марта 2020

Это довольно просто; это просто связано с , что означает asyn c . Эти строки вашего кода выполняются в следующем порядке:

DispatchQueue.main.async {
    self.activities = [decodedLists] // 2
}
print(self.activities) // 1

Итак, сначала вы читаете и печатаете пустое значение self.activities, а затем через некоторое время вы даете ему значение [decodedLists].

...