使用DispatchQueue Swift在JSONSerialization中迭代不同的链接

时间:2017-02-21 18:16:48

标签: json swift serialization

我需要找到一种方法来执行代码几次,根据数组“MisCursos”中包含的元素编辑链接,但我的问题是在DispatchQueue.main.async中,因为这将在循环内部如果我只使用一个循环For,替换数组值。

例如 - >

for x in 0...MisCursos.count - 1 {
   let urlStringAsistencia = "https://losvilos.ucn.cl/tongoy/asist_marcar4.php?c=\(x)&s=\(idSemestreG)&op=list"
   ...
}

CODE

var AsistenciasAll = [Asistencias]()  
var MisCursos = [MisCursosTon]()

MisCursos = [MisCursosTon(id: 639, nombre: "Análisis Financiero (ECIN-01084) {C2}", codigo: "asas", seccion: "C2", rol: "E"), MisCursosTon(id: 61, nombre: "Marketing (ECIN-01083) {C1}", codigo: "asassss", seccion: "C1", rol: "E"), MisCursosTon(id: 400, nombre: "Sistemas De Información I (ECIN-00986) {C1}", codigo: "asas", seccion: "C1", rol: "E")]

let urlStringAsistencia = "https://losvilos.ucn.cl/tongoy/asist_marcar4.php?c=\(x.id)&s=6&op=list"
let urlAsistencia = URL(string: urlStringAsistencia)
URLSession.shared.dataTask(with:urlAsistencia!) { (data, response, error) in
    if error != nil {
        print(error!)
    } else {
        do {
            let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! NSDictionary
            for (key, value) in parsedData {
                ...

                let user = Asistencias(idCurso: 12, idAsistencia: key as! String, fecha: fecha, bloque: bloque, rut: rut, nombres: nombres, apellidos: apellidos, estado: estado, razon: razon, imgurl: imgURL)
            AsistenciasAll.append(user)
            }
    } catch let error as NSError {
        print(error)
    }

    DispatchQueue.main.async {
        let alertController = UIAlertController(title: "Error al Descargar Datos", message: "Al parecer ocurrió un error, vuelve a intentarlo", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "Entendido", style: .cancel, handler: {
            action in self.dismiss(animated: true, completion: nil)})
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)
    }   
}.resume()

1 个答案:

答案 0 :(得分:0)

您需要的API是curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash - sudo apt-get install -y nodejs 。这将允许您将一堆异步任务组合在一起,并在所有这些任务完成时通知您。我将概述您需要的基本知识:

DispatchGroup

您可能还需要跟踪哪些任务(如果有)失败,以便您可以通知用户。

注意:即使任务失败,在每个完成处理程序中调用let group = DispatchGroup() for url in urls { // tell the group that a new task is being added group.enter() URLSession.shared.dataTask(with:urlAsistencia!) { (data, response, error) in // do parsing // tell the group that a task is done group.leave() }.resume() } group.notify(queue: DispatchQueue.main) { // create summary alert } 也很重要。否则,该小组将永远等待它认为仍然未完成的任务。