Swift - 使用NSDictionary字符串数据填充数组

时间:2015-10-23 14:12:27

标签: arrays json swift nsdictionary

我已成功设置会话以从网站提取json数据 - 它可以正常工作。但是,当我开始使用数据填充数组时,数组不会填充信息。请帮忙。 这是我的Person类:

class Person {
    var name1 = "name"
    var info1 = "info"

    init(name1: String, info1: String) {

        self.name1 = name1
        self.info1 = info1
    }
}

这是我的setUpPerson函数:

func setUpPerson() {
    let url = NSURL(string: "http://www.my-sites-jsondata")

    if url != nil {

        let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in

            let urlError = false

            if error == nil {

                var urlContent = NSString(data: data!, encoding: NSUTF8StringEncoding) as NSString!

                var data: NSData = urlContent.dataUsingEncoding(NSUTF8StringEncoding)!

                do {

                    let jsonObject = try (NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSArray)!

                    var index1 = 0

                    while index1 < jsonObject.count {

                        var maindata = (jsonObject[index1] as! NSDictionary)

                        var nameA = maindata["Name"] as! String
                        var infoA = maindata["Info"] as! String

                        var data1 = Person(name1: nameA, info1: infoA)

                        self.arrayOfPersons.append(data1)

                        index1++

                    }

                } catch {

                    print(urlError)
                }

            }

        })

        task.resume()

    }
}

2 个答案:

答案 0 :(得分:0)

您的代码看起来对我很好。

对我而言,您的self.arrayOfPersons也正在设置中(我刚刚使用我的测试应用进行了测试)。

您可能尝试在异步dataTaskWithURL块中设置之前将其打印出来。

异步块在后台执行,因此在块在主线程上执行后立即写入的代码,异步块中的代码将不会完成。

对我来说,代码肯定已经执行了。但是因为异步代码还没有完成执行,你没有看到它设置。

您必须等到异步代码执行完毕后再检查新值。

您可以尝试这样:

dispatch_async(dispatch_get_main_queue(), ^{
    // Set your data on property here
});

答案 1 :(得分:0)

我能够成功完成这个项目。答案有两个......

  1. 我需要dispatch_async(dispatch_get_main_queue()
  2. reloadData()