Значение объекта массива класса всегда возвращает ноль после json-сериализации - PullRequest
0 голосов
/ 04 ноября 2019

Я создал одну функцию под названием «GetDataFromURL», которая является основной задачей для получения URL-адреса формы данных и сохранения в локальном объекте Class Array. используя функцию URlSession.shared.dataTask, я получаю данные в формате DATA, а после этого, используя метод jsonserialization.jsonObject, попадаю в формат json. Ответ представлен в формате словаря, поэтому сохраните его во временном объекте класса, в конце он добавится к объекту массива глобального класса. эта функция вызывается, а Page вызывается методом «View Load». Внутри функции будут отображаться все данные, но каждый раз, когда я получаю нулевой объект массива, пока я отображаю за пределами блока.

public class Modelclass : NSObject {

var id :Int!
var albumId : Int!
var title : String!
var url : String!
var thumbnailUrl : string! 

}

это файл класса, а ниже - файл viewcontroller:

var temp:[ModelClass]? 

override func viewDidLoad() {

super.viewDidLoad()
self.temp = [ModelClass]()
dispatchQueue.main.async{
    self.GetDataFromURL()
}

print(self.temp,"Tesing print")
}



  func GetDatafromURL() {

  if let url = URL(string : 
  "https://jsonplaceholder.typicode.com/photos"){
   URLSession.shared.dataTask(with: url){(data,response,error) in
    if error != nil {
        print(error)
        return
    }
    do{
        let jsonresponse = try jsonserialization.jsonObject(with:data! , 
        options: .mutablecontainers)
        for dictionary in jsonresponse as! [[String:AnyObject]]
        {
            var test = ModelClass()
            test.title = dictionary["title"] as? String
            test.albumId = dictionary["albumId"] as? Int
            test.id = dictionary["id"] as? Int
            test.thumbnailUrl = dictionary["thumbnailUrl"] as? String
            test.url = dictionary["url"] as? String
            self.temp?.append(test)
        }

    }
    catch let jsonerror{
        print(jsonerror)
    }
 }.resume()
}
}

это покажет мне «опционально ([]) Testing print» как Output.and при печати этого временного объекта внутриБлок do будет отображать все данные.

1 Ответ

0 голосов
/ 05 ноября 2019

// addthis var dispatchgroup = DispatchGroup () //

var temp: [Modelclass] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.


    self.GetDatafromURL()

    //Add this
    dispatchgroup.notify(queue: .main){
         print("temp data : \(self.temp.count)")
    }

}



  func GetDatafromURL() {

    //add this
    dispatchgroup.enter()
    //

  if let url = URL(string :
  "https://jsonplaceholder.typicode.com/photos"){
   URLSession.shared.dataTask(with: url){(data,response,error) in
    if error != nil {
        print(error)
        return
    }
    do{


        let jsonresponse = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)

        for dictionary in jsonresponse as! [[String:AnyObject]]
        {
            var test = Modelclass()
            test.title = dictionary["title"] as? String
            test.albumId = dictionary["albumId"] as? Int
            test.id = dictionary["id"] as? Int
            test.thumbnailUrl = dictionary["thumbnailUrl"] as? String
            test.url = dictionary["url"] as? String
            self.temp.append(test)
        }

          //add this
        self.dispatchgroup.leave()
        //


    }
    catch let jsonerror{
        print(jsonerror)
    }
 }.resume()
}

}

...