Swift:无法从singleton类获取数组值

时间:2015-04-16 11:38:02

标签: swift ios8 singleton

您好我从JSON重新获得了值并存储在NSMutableArray中。我试过这个像辛格尔顿一样。我已经使用了空的swift文件。数据已成功检索并存储在已在mainViewController中声明的NSMutableArray中。然后,如果我在mainViewController中使用该NSMutableArray值,它将显示空数组。

我的编码如下。请指导我。

清空Swift文件

 public class json_file{
    var prod_Obj = product_mainVC()

    class var shared: json_file
    {
        struct Static
        {
            static let instance: json_file = json_file()
        }
        return Static.instance
    }

    func dataFromJSON()
    {

        let url = NSURL(string: "http://........--...4900a20659")!
        var data : NSData = NSData(contentsOfURL: url, options: NSDataReadingOptions.DataReadingMapped, error: nil)!
        var dict: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

        let dataArray = dict["data"] as [[String:AnyObject]]  // The array of dictionaries

        for object in dataArray {
            let category_name = object["category_name"] as String
            prod_Obj.ct_name_arr.addObject(category_name)

            let category_child = object["category_child"] as [[String:AnyObject]]
            for child in category_child {
                let sub_category_name = child["sub_category_name"] as String
                prod_Obj.sub_ct_name_arr.addObject(sub_category_name)
            }
        }

        println(prod_Obj.ct_name_arr) //Here value is Getting
        println(prod_Obj.sub_ct_name_arr) //Here value is Getting
    }

}

viewDidLoad中

{
  json_file.shared.dataFromJSON()
  println(ct_name_arr) //Prints Empty Array  [Intially Declared as NSMutableArray]
  println(sub_ct_name_arr) //Prints Empty Array [Intially Declared as NSMutableArray]
}

1 个答案:

答案 0 :(得分:0)

我试图了解问题,但我看不到product_mainVC。因为我重新修改了你的课程。

class JsonFile
{
    private(set) var categoryNames:[String];
    private(set) var subCategoryNames:[String];

    class let shared:JsonFile = JsonFile();

    private init()
    {
        self.categoryNames = [];
        self.subCategoryNames = [];
    }

    func dataFromJson()
    {
        let url = NSURL(string: "http://........--...4900a20659")!
        if let data : NSData = NSData(contentsOfURL: url, options: NSDataReadingOptions.DataReadingMapped, error: nil)
        {
            if let dict: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as? NSDictionary
            {
                if let dataArray = dict["data"] as? [[String:AnyObject]]  // The array of dictionaries
                {
                    for object in dataArray {
                        let category_id = object["category_id"] as Int
                        let category_name = object["category_name"] as String
                        categoryNames.append(category_name);


                        let category_child = object["category_child"] as [[String:AnyObject]]
                        for child in category_child {
                            let sub_category_id = child["sub_category_id"] as Int
                            let sub_category_name = child["sub_category_name"] as String
                            subCategoryNames.append(sub_category_name);

                        }
                    }
                }
            }
        }

        println(categoryNames);
        println(subCategoryNames);
    }
}

我做了

修改你的Singleton方式到一个安全且更简单的模式,在类中创建数组categoryNamessubCategoryNames内部,因为这样可以更好地操作和保护你的获取数据以防止可能的崩溃。

实施

JsonFile.shared.dataFromJson();

println("count categoryNames");
println(JsonFile.shared.categoryNames.count);
println("count subCategoryNames");
println(JsonFile.shared.subCategoryNames.count);

你需要考虑

此代码是同步的,因为如果您的数据或请求速度很慢,应用程序中的主线程将冻结等待返回,这对您的用户不利。想想是否有必要同步。

永远不会使用

let category_id = object["category_id"] as Int。为什么要在代码中使用它?