【问题标题】:Function with custom data array具有自定义数据数组的函数
【发布时间】:2016-02-15 08:36:17
【问题描述】:

我有以下函数调用:

@IBAction func submitCourse(sender: AnyObject) {
    // print("Enter")
        getTime( (courseName.text!), courseCode: (codeName.text!))
        print(classes[0].end);
        //print("ASODASODJASDJASASDASDD \(string1)")
}

以及自定义数据类:

class ClassSchedule {
var course: String?
var code: String?
var section: String?
var start: String?
var end: String?

init(course: String, code: String, section: String, start: String, end: String)
{
    self.course = course
    self.code = code
    self.section = section
    self.start = start
    self.end = end

}

}

并请求JSON对象,将其解析为classSchedule的数组:

 // Read the JSON
    do {
        let data: NSData? = NSData(contentsOfURL: url)
        if let jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
        {
            //////ARRAY///////
            let dataArray = jsonResult["data"] as! NSArray
            //////
            let arrayLength = dataArray.count
            var count = 0


            print("TOTAL OF CLASSES: \(arrayLength)");

            for item in dataArray
            {              
                 classes.append(ClassSchedule(course: "TEMP", code: "TEMP", section: "TEMP", start:"TEMP", end:"TEMP") )

                classes[count].course = item["subject"] as! String
                classes[count].code = item["catalog_number"] as! String
                classes[count].section = item["section"] as! String
                print("Subject: \(classes[count].course!) \(classes[count].code!)");
                print("Section: \(classes[count].section!)");
              // print("Section: \(section_numb)");

                let subjectArray = item["classes"] as! NSArray
                for item2 in subjectArray{

                    let dateDictionary = item2["date"] as! NSDictionary
                    //let startTime = dateDictionary["start_time"]!
                    //self.performSelectorOnMainThread("updateIPLabel:", withObject: startTime, waitUntilDone: false)
                    //let endTime = dateDictionary["end_time"]!
                    classes[count].start = dateDictionary["start_time"] as! String
                    classes[count].end = dateDictionary["end_time"] as! String
                    string1 = classes[count].start!
                    print("START TIME: \(classes[count].start!)");
                    print("End Time: \( classes[count].end!)");
                    print("")
                   count += 1
                    print(count)

                }

            }
            //let subject = dataArray["subject"]
        }

    } catch {
        print("bad things happened")
    }

    print("ASDIAWDWD: \(classes[0].section)")
   // print("ASDIAWDWASDASDD: \(classes[1].section)")
    }).resume()

函数中的那些打印语句可以正常工作并打印想要的数据。 我无法将 ClassSchedule 的填充数组返回到 ViewController.swift

我尝试将数组声明为全局变量,但它仍然在print(classes[0].end); 出现错误,提示数组索引超出范围。

感觉是JSON的异步请求导致的,但不知道怎么解决。

【问题讨论】:

  • 只是为了确保。你用dataTaskWithRequest函数来处理数据吧?
  • 不,我正在使用 dataTaskwithURL。如果我使用 dataTaskWithRequest 会有什么不同吗?
  • oo,实际上没有:D。那么,如果在打印出变量之前检查任务的state 怎么样?

标签: arrays json swift class


【解决方案1】:

是的。那是因为它是一个异步调用。您必须在 API 调用成功中保留一个本地数组,并且在所有处理之后,您必须有一个回调将数据发送回调用者。即,在进行 API 调用时,您必须有一个块作为参数。

更新

func yourAPICall(addNecessaryParameters, failure: NSError -> (), completion: NSArray -> ()) {
    // API call and parsing goes here

    var returnArray = [AnyObject]()
    if let _ = error {
        failure(error!)
    }
    else {
        completion(returnArray)
    }
}

【讨论】:

  • 您能否详细说明“在进行 API 调用时,您必须有一个块作为参数。”你是说我应该将对象数组作为参数传入json调用的函数中?
  • 感谢您的帮助。我现在可以在 viewController.swift 上获取数组,但出现了新问题。我只能在 getTime() 函数调用中访问它。到目前为止,我已经用工作代码更新了问题。请看一看。
  • API 调用获取的数据将在成功块中返回。您必须将该数据分配给块内 viewController 的实际数组。如果不是,则根本不会初始化数组。
  • 我已更新 getTime 函数以设置成功块。我已将“类”和“类临时”都定义为应用程序中的全局变量。更新了问题中的代码,但仍然无法正常工作。请你看一下好吗?
  • 这个打印语句被异步调用 - print("Pass it to tableview (classesTemp[0].end) ") 而这个打印语句 print("IN VIEASDASDW CONTROLLER (classesTemp[0].end )");被称为太早了。这是由于异步 api 调用。 API 调用将在后台执行,第二个打印语句由于同步执行而立即被调用。 API 成功后,第一个打印语句将被异步调用。当api成功时,您可以为tableView重新加载数据。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 2018-03-15
  • 2013-05-13
  • 2013-04-14
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多